有好几组物品,每组物品最多取一个。(分组背包问题)
根据将会用到的内容做出状态定义:
定义dp[i][j]为:只用前i组物品填满重量为j的背包,的最大价值。
易得:
不用第i组物品时,dp[i][j]=dp[i-1][j]
用第i组物品时,dp[i][j]=max(dp[i][j],dp[i-1][j-w[k]]+v[k]),其中k为被选中组中的物品。
要用max来找出这i组物品中最划算的那一个。
第i组物品可以不选,故dp[i][j]的初始状态即为dp[i-1][j]。
AC代码
#include <bits/stdc++.h>
using namespace std;
int m,n,v[101][1001],k,w[101][1001],cnt[101],a,b,c;
int dp[101][1001];
//定义dp[i][j]为:只用前i组物品,填满背包j的最大价值
int main(){
cin>>m>>n;
for(int i=1;i<=n;++i){
cin>>a>>b>>c;
k=c>k?c:k;
w[c][++cnt[c]]=a;
v[c][cnt[c]]=b;
}
for(int i=1;i<=k;++i)
for(int j=1;j<=m;++j){
dp[i][j]=dp[i-1][j];
for(int l=1;l<=cnt[i];++l)
if(j>=w[i][l])dp[i][j]=max(dp[i][j],dp[i-1][j-w[i][l]]+v[i][l]);
}
cout<<dp[k][m];
return 0;
}