标签:
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 3720 | Accepted: 1125 |
Description
Input
Output
Sample Input
12 5 3 1 2 16 0 0 0 1 0 0 0 0 0
Sample Output
Throw in 2 cents, 2 nickels, 0 dimes, and 0 quarters. Charlie cannot buy coffee.
题意:给出想要买的东西的价格p,有四枚硬币面值分别是1,5,10,25,然后给出每一种硬币的个数,求买这个东西最多需要多少枚硬币
这题很不错,num[i][j]用来记录i状态下第j枚硬币的个数,dp[i]用来记录硬币的个数;要求的就是在硬币个数最多的情况下每一种硬币的个数
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 6 using namespace std; 7 const int MAX = 10000 + 10; 8 int dp[MAX],num[MAX][5],c[5],p; 9 int w[5]={1,5,10,25}; 10 void ZeroOnePage(int cost, int mount, int kind) //01背包传递参数有这一种硬币的数量和种类 11 { 12 for(int i = p; i >= cost; i--) 13 { 14 if(dp[i - cost] > -1 && dp[i] < dp[i - cost] + mount) //求枚数最多的情况,01的数量需要参数传递,完全背包就是1 15 { 16 dp[i] = dp[i - cost] + mount; 17 for(int j = 0; j < 4; j++) 18 num[i][j] = num[i - cost][j]; //更改这一状态下每一种硬币的数量 19 num[i][kind] += mount; 20 } 21 } 22 } 23 void CompletePage(int cost, int kind) 24 { 25 for(int i = cost; i <= p; i++) 26 { 27 if(dp[i - cost] > -1 && dp[i] < dp[i - cost] + 1) 28 { 29 dp[i] = dp[i - cost] + 1; 30 for(int j = 0; j < 4; j++) 31 num[i][j] = num[i - cost][j]; 32 num[i][kind] += 1; 33 } 34 } 35 } 36 void MultiplePage(int cost,int mount,int kind) 37 { 38 if(cost * mount >= p) 39 { 40 CompletePage(cost, kind); 41 return; 42 } 43 int k = 1; 44 while(k < mount) 45 { 46 ZeroOnePage(k * cost, k, kind); 47 mount = mount - k; 48 k <<= 1; 49 } 50 if(mount > 0) 51 ZeroOnePage(mount * cost, mount, kind); 52 return ; 53 } 54 int main() 55 { 56 while(scanf("%d", &p) != EOF) 57 { 58 int sum = p; 59 for(int i = 0; i < 4; i++) 60 { 61 scanf("%d", &c[i]); 62 sum += c[i]; 63 } 64 if(sum == 0) 65 break; 66 memset(num,0,sizeof(num)); 67 memset(dp,-1,sizeof(dp)); 68 dp[0] = 0; 69 for(int i = 0; i < 4; i++) 70 if(c[i]) 71 MultiplePage(w[i],c[i],i); 72 if(dp[p] > 0) 73 { 74 printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",num[p][0],num[p][1],num[p][2],num[p][3]); 75 } 76 else 77 { 78 printf("Charlie cannot buy coffee.\n"); 79 } 80 } 81 return 0; 82 }
poj1787Charlie's Change(多重背包+记录路径+好题)
标签:
原文地址:http://www.cnblogs.com/zhaopAC/p/5052076.html