HDU-2844-Coins
来源:互联网 发布:夏季太极服淘宝网 编辑:程序博客网 时间:2024/06/05 17:38
这个题是一个多重背包问题,只不过要求你求出能够组合出不同数的个数,其实仔细看可以发现dp[i]==i满足这个条件的时候就应该找到对应的一个满足一个组合的数
所以在多重背包计算完成以后只需要遍历一次,统计出dp[i]==i的个数即为答案
代码:
#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int maxn=101;int n,m,ans,num[maxn],c[maxn],dp[100010];void CompletePack(int cost,int weight){ for(int i=cost;i<=m;i++)dp[i]=max(dp[i],dp[i-cost]+weight);}void ZeroOnePack(int cost,int weight){ for(int i=m;i>=cost;i--)dp[i]=max(dp[i],dp[i-cost]+weight);}void MultiplyPack(int cost,int weight,int amount){ if(cost*amount>=m)CompletePack(cost,weight); else {int k=1;while(k<amount){ ZeroOnePack(k*cost,k*weight); amount-=k; k<<=1;}ZeroOnePack(amount*cost,amount*weight); }}int main(){ while(scanf("%d%d",&n,&m)&&(n+m)) {ans=0;memset(dp,0,sizeof(dp));for(int i=0;i<n;i++) scanf("%d",&c[i]);for(int i=0;i<n;i++) scanf("%d",&num[i]);for(int i=0;i<n;i++) MultiplyPack(c[i],c[i],num[i]);for(int i=1;i<=m;i++) if(dp[i]==i)ans++;printf("%d\n",ans); } return 0;}
- HDU 2844 - Coins
- hdu 2844 Coins
- hdu 2844 Coins 背包
- hdu 2844 coins
- Hdu 2844 Coins
- HDU 2844 Coins
- hdu 2844 Coins
- hdu 2844 Coins
- HDU 2844 coins
- hdu 2844 Coins
- hdu 2844 coins
- HDU-2844-Coins
- hdu 2844 Coins
- hdu 2844 Coins
- HDU - 2844 Coins
- hdu 2844 Coins dp
- HDU 2844 Coins
- hdu 2844 Coins
- 毕业两年总结
- 编程之“与、或(&|)”的使用技巧
- 博客小技巧
- 【读书笔记】linux系统中"共享文件"的原理
- 让Office 2003与Office 2010完美共存
- HDU-2844-Coins
- linux进程通信---消息队列
- [Python]网络爬虫:Python中的正则表达式教程
- 王兴:恨在中国创业,他先后创办了校内和饭否,但都令人瞩目地...
- Google Chrome调试js入门
- Java大量线程运行时,减少内存占用量方法
- KL25进入低功耗模式无法退出后的芯片救活
- 7月6日---7月12日时间(本周20小时)
- 关于Android开发中SensorManager频率设置的问题