POJ 1276 Cash Machine(多重背包)
2015-01-19 10:49
447 查看
把每种物品二进制拆分成log C[i]种
当A[i]*C[i]>=Cash时是完全背包,否则对这些拆分后的物品是01背包(两者区别只在于第二重循环的顺序)
具体见刘汝佳小白书
代码:
当A[i]*C[i]>=Cash时是完全背包,否则对这些拆分后的物品是01背包(两者区别只在于第二重循环的顺序)
具体见刘汝佳小白书
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int dp[100005]; int a[15]; int c[15]; int N,M; int Cash; int main(){ while(~scanf("%d",&Cash)){ scanf("%d",&N); for(int i=1;i<=N;i++){ scanf("%d%d",&c[i],&a[i]); } memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=1;i<=N;i++){ if(a[i]*c[i]>=Cash){ for(int j=a[i];j<=Cash;j++){ dp[j]=dp[j]||dp[j-a[i]]; } } else { int k=1; int m=c[i]; while(k<m){ for(int j=Cash;j>=k*a[i];j--){ dp[j]=dp[j]||dp[j-k*a[i]]; } m-=k; k<<=1; } for(int j=Cash;j>=m*a[i];j--){ dp[j]=dp[j]||dp[j-m*a[i]]; } } } int res=0; for(int i=Cash;i>=0;i--){ if(dp[i]){ res=i; break; } } printf("%d\n",res); } return 0; }
相关文章推荐
- POJ 1276 Cash Machine(DP多重背包)
- 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 【凑钱数的问题】【枚举思路 或者 多重背包解决】
- 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 多重背包