钢条切割
初始化
dp[0]=0;
动态方程
dp[i]=max(dp[i],a[i]+dp[i-j])
0-1背包
动态方程
for(int i=1;i<=n;i++){
cin>>v[i]>>w[i];
}
for(int i=1;i<=n;i++){
// 为什么一维情况下枚举背包容量需要逆序?
// 如果正序,(dp[j-v[i]]+w[i])时,dp[j]的状态已经被「污染」,逆序则不会有这样的问题。
for(int j=m;j>=v[i];j--){
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}
完全背包
for(int i=1;i<=n;i++){
cin>>v[i]>>w[i];
}
for(int i=1;i<=n;i++){
//每种物品无限个
// 采用顺序,接本次i循环的状态
for(int j=v[i];j<=m;j++){
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}
多重背包
int t=0; //t将代替n
while(n--)
{
cin>>a>>b>>s;
while(s--)
{
v[++t]=a;
w[t]=b;
}//把多重背包拆成01背包
}