hnust_loser
http://acm.hdu.edu.cn/diy/contest_showproblem.php?cid=17157&pid=1001
思路:先将数据规模缩小,然后用二维的完全背包就可以直接解决了。
#include<iostream> #include<cstring> using namespace std; int bag[2222][2222]; int m[]={4,5,2},g[]={0,2,4}; int val[3]; int main() { int mmax,gmax,z,s,e; while(cin>>mmax>>gmax>>val[0]>>val[1]>>val[2]) { if(!(mmax||gmax||val[0]||val[1]||val[2])) break; mmax/=25;gmax/=25; memset(bag,0,sizeof(bag)); for(int i=0;i<3;i++) { for(int j=m[i];j<=mmax;j++) { for(int k=g[i];k<=gmax;k++) { if(bag[j][k]<bag[j-m[i]][k-g[i]]+val[i]) bag[j][k]=bag[j-m[i]][k-g[i]]+val[i]; } } } cout<<bag[mmax][gmax]<<endl; } return 0; }