分组背包的裸题……依据组数,体积,物品从外到内的顺序进行循环即可。转移与01背包类似
#include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<climits> #include<vector> using namespace std; int zu,xh[105][1005],f[1005]; int wp[105],c[1005],w[1005]; int main() { memset(wp,0,sizeof(wp)); ios::sync_with_stdio(false); int m,n; cin>>m>>n; for(register int i=1;i<=n;i++) { int q; cin>>w[i]>>c[i]>>q; wp[q]++; zu=max(zu,q); xh[q][wp[q]]=i; } for(register int i=1;i<=zu;i++) { for(register int j=m;j>=0;j--) { for(register int k=1;k<=wp[i];k++) { if(j>=w[xh[i][k]]) { f[j]=max(f[j],f[j-w[xh[i][k]]]+c[xh[i][k]]); } } } } cout<<f[m]; return 0; }