poj 1276 Cash Machine (多重背包)
2014-08-02 09:45
288 查看
#include<stdio.h> #include<iostream> #include<cstring> using namespace std; int c[100],p[100]; int V,dp[100010]; void comback(int w,int v) //完全背包 { for(int i=v;i<=V;i++) dp[i]=max(dp[i],dp[i-v]+w); } void oneback(int v,int w) //01背包 { for(int i=V;i>=v;i--) dp[i] =max(dp[i],dp[i-v]+w) ; } int main() { int i,j,n,k,x,y; while(~scanf("%d",&V)) { memset(c,0,sizeof(c)); memset(p,0,sizeof(p)); memset(dp,0,sizeof(dp)); scanf("%d",&n); for(i=k=0;i<n;i++) { scanf("%d%d",&x,&y); if(x!=0&&y!=0) { p[k]=x; c[k++]=y; } } if(V==0||n==0) printf("0\n"); else { for(i=0;i<k;i++) { if(p[i]*c[i]>=V) // 如果这个类型的钞票 总价值 大于V 就相当于 完全背包 随便取 comback(c[i],c[i]); else { for(j=1;j<=p[i];j<<=1) //01背包 这里用的是二进制 优化 没个数字都能用1 ,2 ,4……的和表示 这里把 钞票的个数分开 形成若干个 就转化成01背包求解 { oneback(j*c[i],j*c[i]); p[i]-=j; } oneback(p[i]*c[i],p[i]*c[i]); } } printf("%d\n",dp[V]); } } return 0; }
相关文章推荐
- POJ 1276 Cash Machine -- 动态规划(背包问题)
- POJ_1276 Cash Machine (多重背包)
- POJ-1276-Cash Machine(多重背包)
- POJ 1276 Cash Machine 【多重背包】
- POJ-1276 Cash Machine(经典多重背包)
- POJ 1276 Cash Machine(多重背包)
- poj 1276 Cash Machine----多重背包
- POJ 1276 Cash Machine -- 动态规划(背包问题)
- poj 2392 (Space Elevator) 1276 (Cash Machine)变形背包
- POJ 1276 Cash Machine (多重背包)
- POJ - 1276 Cash Machine 多重背包模板题
- POJ 1276 Cash Machine (多重背包+技巧)【标记式背包】
- POJ-1276-Cash Machine(多重背包)
- POJ 1276 - Cash Machine(多重背包)
- POJ 1276 Cash Machine(多重背包)
- POJ 1276 Cash Machine 多重背包
- POJ 1276 (多重背包) Cash Machine
- poj 1276 Cash Machine 背包问题
- poj1276 Cash Machine(多重背包)
- POJ 1276:Cash Machine 多重背包