0 1 背包问题
核心代码;
定义 dp[i][j] 是从前不i-1个物品中,选出来总重量不超过j的物品时,总价值的最大值
显然 dp[i][j]=0, 因为你没物品可以取的时候,背包的价值为零。 dp[0][j]=0;
for(int i=0;i<n;i++){
for(int j=0;j<w;j++){
if(j<w[i]) dp[i+1][j]=dp[i][j];
else dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+p[i]);
}
}
printf("%d\n",dp[n][w]);
代码进行优化:
如下:
int dp[maxn];
for(int i=0;i<n;i++){
for(int j=W,j>=w[i];j--){
dp[j]=max(dp[j],dp[j-w[i]]+p[i])
}
}
代码可以通过不断重复用一个数组来实现。比用二维数组更好。