题目:有 N种物品和一个容量是 V 的背包,每种物品都有无限件可用。(这个条件是和01背包题目唯一的区别)
第 i 种物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。
#include<iostream>
using namespace std;
int max(int a,int b){
if(a>b) return a;
return b;
}
int main(){
int n,s;
int res[1010][1010];
int v[1010],w[1010]={{0}};
cin>>n>>s;
for(int i=1;i<=n;i++){
cin>>v[i]>>w[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=s;j++){
if(j<v[i]){
res[i][j]=res[i-1][j];
}else{
res[i][j]=max(res[i-1][j],res[i][j-v[i]]+w[i]);
//完全背包和01背包解法的唯一区别:状态转化
/*
第i个物品可以装0,1,2,3,4····k次,从中必有一个 次数 满足最优解
res[i][j]=max(res[i-1][j],res[i-1][j-v[i]+w[i],res[i-1][j-2*v[i]]+2*w[i],·····,res[i-1][j-k*v[i]]+k*w[i]);
用j-v[i]换掉j,再在每个代数式上加w[i]得到:
dp(i,j-v)+w=max( dp(i-1,j-v)+w , dp(i-1,j-2v)+2w,dp(i-1,j-3v)+3w , dp(i-1,j-4v)+4w,~~dp(i-1,j-kv)+kw)
将他带入第一行推导得出
res[i][j]=max(res[i-1][j],res[i][j-v[i]]+w[i]);
在这个化简过程中有应用 多米诺骨牌思想背包容量为j时成立,所以容量为j-v[i]时,等式也应当是成立的
*/
}
}
}
cout<<res[n][s];
return 0;
}