模板来源:codevs 5429
根据背包问题的相关状态转移方程,我们不难写出朴素的算法
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 inline int read() { 7 int ret=0; 8 int op=1; 9 char c=getchar(); 10 while(c<'0'||c>'9') {if(c=='-') op=-1; c=getchar();} 11 while(c<='9'&&c>='0') ret=ret*10+c-'0',c=getchar(); 12 return ret*op; 13 } 14 int n,m; 15 int c[7010],v[7010],num[7010]; 16 int f[7010]; 17 int main() { 18 n=read(); m=read(); 19 for(int i=1;i<=n;i++) { 20 c[i]=read(); v[i]=read(); num[i]=read(); 21 } 22 for(int i=1;i<=n;i++) 23 for(int j=m;j>=c[i];j--) 24 for(int k=0;k<=num[i];k++) 25 if(j-c[i]*k>=0) 26 f[j]=max(f[j],f[j-c[i]*k]+v[i]*k); 27 printf("%d\n",f[m]); 28 return 0; 29 }