有N件物品和一个容量为V的背包。第i件物品的体积是w[i],价值是v[i]。
1.0-1 背包
求解将哪些物品装入背包可使价值总和最大,每种物品至多只能选择一件
dp[i][j]表示第i件物品放入容量为j的背包所得的最大价值
dp[i][j]=max{dp[i-1][j-w[i]]+v[i] , dp[i-1][j]};
这里我们从j=V倒推回来的话可以优化成
dp[j]=max{dp[j] , dp[j-w[i]]+v[i]};
核心代码:
for(i=0;i<=V;i++){
dp[i] = 0;//初始化均为0
}
for(i=1;i<=n;i++){
for(j=V;j>=w[i];j--){//倒序更新,对于重量w[i]小于j的不作更新
//choice[i][j] = true;//如需记录,则可另创一个辅助数组(详见下文)
dp[j]=max{dp[j],dp[j-w[i]]+v[i]};
}
}
dp[V]即为最大的价值
2.恰好装满时
此时只需改变初始值,即
#define INF 0x7fffffff
for(i=1;i<=V;i++)