poj1276 Cash Machine(完全背包模板题)
题目链接:https://vjudge.net/problem/POJ-1276
题意:有现今cash,和n种钱币,每种钱币有ni个,价值为di,求各种钱币组成的不超过cash的最大钱数.......
思路:二进制拆分转化为01背包,或者转化为完全背包都是可以的
完全背包:
//这题可以让w,v从i=1时开始,这样f[0]=0,当cash=0或n=0时直接输出0 //定义一个num数组来让它存储还剩下多少个数 #include <iostream> #include <cstring> using namespace std; const int maxn=1000+10; int cash,n; int w[maxn],v[maxn]; int f[maxn*100],num[maxn*100]; int main() { ios::sync_with_stdio(false); while(cin>>cash>>n) { memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) { cin>>w[i]>>v[i]; } for(int i=1;i<=n;i++) { memset(num,0,sizeof(num)); for(int j=v[i];j<=cash;j++) { if(f[j]<f[j-v[i]]+v[i]&&num[j-v[i]]<w[i]) { f[j]=f[j-v[i]]+v[i]; num[j]=num[j-v[i]]+1; } } } cout<<f[cash]<<endl; } return 0; }