hdu2844
来源:互联网 发布:js控制video播放停止 编辑:程序博客网 时间:2024/05/18 01:18
题目
这道题,刚开始题没读懂,就是这句话:,A1,A2,A3...An and C1,C2,C3...Cn corresponding to the number of Tony's coins of value ,
原本是A1,A2,A3...An 代表 价值
C1,C2,C3...Cn 代表 数量
结果理解反了。题都读了一下午,真的是……唉……
题意:
一位同学想要买手表,他有n种硬币,每种硬币已知有num[i]个。已知手表的价钱最多m元,问她用这些钱能够凑出多少种价格来买手表。
又或是:
题意:Tony想要买一个东西,他只有n中硬币每种硬币的面值为a[i]每种硬币的数量为c[i]要买的物品价值不超过m
输入:第一行输入n和m,第二行输入n个硬币的面值和n个硬币的数量,输入0 0结束
输出:1到m之间有多少价格Tony可以支付
代码如下:
#include<stdio.h>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;const int N = 100+5;const int M =1e5+10;int value[N];int value1[M];int jian[N];int dp[M];int n,m;void solve(){ int cnt =0; for(int i=1; i<=n; i++) { for(int j=1; j<=jian[i]; j<<=1) { value1[cnt]=value[i]*j; jian[i]-=j; cnt++; } if(jian[i]>0) { value1[cnt]=value[i]*jian[i]; cnt++; } } for(int i=0; i<cnt; i++) for(int j=m; j>=value1[i]; j--) { if(dp[j]<dp[j-value1[i]]+value1[i]) { dp[j]=dp[j-value1[i]]+value1[i]; } } int sum=0; for(int i=1; i<=m; i++)//不太理解 { if(i==dp[i]) sum++; } printf("%d\n",sum);}int main(){ while( ~scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; memset(dp,0,sizeof(dp)); memset(value,0,sizeof(value)); memset(value1,0,sizeof(value1)); memset(jian,0,sizeof(jian)); for(int i=1; i<=n; i++) scanf("%d",&value[i]); for(int i=1; i<=n; i++) scanf("%d",&jian[i]); solve(); } return 0;}有三句话是百度借鉴的: for(int i=1; i<=m; i++) { if(i==dp[i]) sum++; }
不太能理解?
另外:
最开始理解成了,要求凑出最大值时,硬币的个数:结果代码如下
#include<stdio.h>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;const int N = 100+5;const int M =1e4+10;int value[N];int value1[N*20];int need[N];int need1[N*20];int jian[N];int dp[M];int n,m;void solve(){ int cnt =0,ans; for(int i=1;i<=n;i++){ for(int j=1;j<=jian[i];j<<=1) { value1[cnt]=value[i]*j; need[cnt]=j; jian[i]-=j; cnt++; } if(jian[i]>0) { value1[cnt]=value[i]*jian[i]; need[cnt]=jian[i]; cnt++; } } for(int i=0;i<cnt;i++) for(int j=m;j>=value1[i];j--) { if(dp[j]<dp[j-value1[i]]+value1[i]){ dp[j]=dp[j-value1[i]]+value1[i]; need1[j]=need1[j-need[i]]+need[i]; } } printf("\n%d\n",need1[m]);}int main(){ while( ~scanf("%d%d",&n,&m)){ if(n==0&&m==0) break; memset(dp,0,sizeof(dp)); memset(need,0,sizeof(need)); memset(need1,0,sizeof(need1)); for(int i=1;i<=n;i++) scanf("%d",&jian[i]); for(int i=1;i<=n;i++) scanf("%d",&value[i]); solve(); } return 0;}
阅读全文
0 0
- hdu2844
- HDU2844
- hdu2844
- hdu2844
- hdu2844
- HDU2844 Coins
- hdu2844 Coins
- HDU2844:Coins
- hdu2844 Coins
- HDU2844 Coins
- HDU2844:Coins
- hdu2844 Coins
- hdu2844之混合背包
- hdu2844 多重背包
- HDU2844:Coins(多重背包)
- hdu2844(多重背包)
- hdu2844 Coins 多重背包
- hdu2844 Coins --多重背包
- Mysql主从复制和读写分离Amoeba实现
- 测试
- VUE+WebPack游戏设计:为对战扑克牌增加能力槽
- js关闭当前弹出的小窗口并打开新窗口
- ORACLE Scheduler特性(7)Scheduler抛出的Events
- hdu2844
- 如何提高app的用户参与度?
- Wordpress主题magazine point底部版权信息删除
- C++智能指针详解
- android6.0动态权限申请工具类
- ue4 导出渲染全景视频序列帧
- 判断一棵树是否是完全二叉树
- 油田信息化:通往智慧之路(1.1-智慧地球概念的提出)
- piwik的性能怎么样?