博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1742
阅读量:6073 次
发布时间:2019-06-20

本文共 1126 字,大约阅读时间需要 3 分钟。

  这是一道可以用多重背包来写的题,但是这种方法速度很慢,2829MS。思路很简单,将多重背包转化为01背包,dp所对应的下标为钱数,如果能刚好凑到下标所对应的钱数,就赋为1。最后输出被赋为1的个数就是可能性。

#include
#include
#define MAX_PRICE 1000000#define MAX_COIN 110void mk_list(int,int,int);int top=1,stk[MAX_PRICE];int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF&&!(n==0&&m==0)) { int i,j,val[MAX_COIN],amnt[MAX_COIN],dp[MAX_PRICE]; for(i=1;i<=n;i++) { scanf("%d",&val[i]); } for(i=1;i<=n;i++) { scanf("%d",&amnt[i]); } for(i=1,top=1;i<=n;i++) { mk_list(val[i],amnt[i],m); } for(i=1;i<=m;i++) dp[i]=0; dp[0]=1; int ans=0; for(i=1;i
=stk[i];j--) { if(!dp[j]&&dp[j-stk[i]]==1) { dp[j]=1; ans++; } } } printf("%d\n",ans); } return 0;}void mk_list(int val,int amnt,int m){ int k=1; while(k
<=m) { stk[top++]=k*val; amnt-=k; k=k*2; } if(val*amnt<=m) { stk[top++]=val*amnt; }}

转载于:https://www.cnblogs.com/coredux/archive/2012/07/30/2616095.html

你可能感兴趣的文章
Oracle DG 逻辑Standby数据同步性能优化
查看>>
exchange 2010 队列删除
查看>>
android实用测试方法之Monkey与MonkeyRunner
查看>>
「翻译」逐步替换Sass
查看>>
H5实现全屏与F11全屏
查看>>
处理excel表的列
查看>>
Excuse me?这个前端面试在搞事!
查看>>
C#数据采集类
查看>>
quicksort
查看>>
检验函数运行时间
查看>>
【BZOJ2019】nim
查看>>
Oracle临时表空间满了的解决办法
查看>>
四部曲
查看>>
LINUX内核调试过程
查看>>
【HDOJ】3553 Just a String
查看>>
Java 集合深入理解(7):ArrayList
查看>>
2019年春季学期第四周作业
查看>>
linux环境配置
查看>>
ASP.NET MVC中从前台页面视图(View)传递数据到后台控制器(Controller)方式
查看>>
lintcode:next permutation下一个排列
查看>>