接上一篇的的01背包
完全背包问题实在01背包的基础之上,每一个物品的数量可能不止1的情况
对原先的01背包的代码可以复用
void solve(){
for(int i=0;i<n;i++){
for(int j=0;i<=W;j++){
if(j<w[i]){
dp[i+1][j]=dp[i][j];
}else{
dp[i+1][j]=max(dp[i][j],dp[i+1][j-w[i]]+v[i]);
}
}
}
printf("%d\n",dp[n][W]);
}用一维数组来实现
int dp[MAX_N+1];
void solve(){
for(int i=0;i<n;i++){
for(int j=w[i];j<=W;j++){
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
printf("%d\n",pd[W]);
}
本文深入讲解了完全背包问题,这是在01背包基础上的一种扩展,允许每个物品有多个可用实例。文章提供了两种解决方法:一种使用二维数组实现,另一种则采用更节省空间的一维数组方法。
1630

被折叠的 条评论
为什么被折叠?



