poj 1787 Charlie's Change

来源:互联网 发布:淘宝王成勇培训靠谱吗 编辑:程序博客网 时间:2024/05/22 06:24

题目大意:

有4中硬币,给你一个价值v的背包,和四种硬币的数量,让你在装满背包的情况下使用的钱币尽量多,然后输出几种钱币的使用;

解题思路:

这道题目用多重背包和完全背包都可以做,下面这段代码我是参考的别人的代码写的。
首先要注意的是,在进行状态转移的时候,一定要保证上一个状态出现过;
used【j】表示价值达到j的时候一种物品的使用次数;
path【j】表示上一次最优状态的时候的价值的总和;
dp【j】标志背包体积达到j的时候最多使用的钱币数
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int main(){int v;int num[4];int val[5]={1,5,10,25};while(~scanf("%d",&v)){for(int i=0;i<4;i++)scanf("%d",&num[i]);if(v==0&&num[0]==0&&num[1]==0&&num[2]==0&&num[3]==0)break;int dp[10010];int path[10010];int used[10010];memset(path,-1,sizeof(path));memset(dp,-1,sizeof(dp));dp[0]=0;for(int i=0;i<4;i++){memset(used,0,sizeof(used));for(int j=val[i];j<=v;j++){if(dp[j-val[i]]+1>dp[j]&&dp[j-val[i]]>=0&&used[j-val[i]]<num[i]){dp[j]=dp[j-val[i]]+1;used[j]=used[j-val[i]]+1;path[j]=j-val[i];}}}int ans[26]={0};while(path[v]!=-1){ans[v-path[v]]++;v=path[v];}if(dp[v]<0)printf("Charlie cannot buy coffee.\n");elseprintf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n", ans[val[0]], ans[val[1]], ans[val[2]], ans[val[3]]);}} 


0 0
原创粉丝点击