Too Rich
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 395 Accepted Submission(s): 118
Problem Description
You are a rich person, and you think your wallet is too heavy and full now. So you want to give me some money by buying a lovely pusheen sticker which costs p dollars from me. To make your wallet lighter, you decide to pay exactly p dollars by as many coins and/or banknotes as possible.
For example, if p=17 and you have two $10 coins, four $5 coins, and eight $1 coins, you will pay it by two $5 coins and seven $1 coins. But this task is incredibly hard since you are too rich and the sticker is too expensive and pusheen is too lovely, please write a program to calculate the best solution.
Input
The first line contains an integer T indicating the total number of test cases. Each test case is a line with 11 integers p,c1,c5,c10,c20,c50,c100,c200,c500,c1000,c2000, specifying the price of the pusheen sticker, and the number of coins and banknotes in each denomination. The number ci means how many coins/banknotes in denominations of i dollars in your wallet.
1≤T≤20000
0≤p≤109
0≤ci≤100000
Output
For each test case, please output the maximum number of coins and/or banknotes he can pay for exactly p dollars in a line. If you cannot pay for exactly p dollars, please simply output '-1'.

1 #include <bits/stdc++.h> 2 using namespace std; 3 using LL = long long; 4 const int maxn = 11; 5 const int val[] = {0, 1, 5, 10, 20, 50, 100, 200, 500, 1000, 2000}; 6 int cnt[maxn],ret; 7 LL sum[maxn]; 8 void dfs(LL rest,int pos,int cnt){ 9 if(rest < 0) return; 10 if(!pos){ 11 if(!rest) ret = max(ret,cnt); 12 return; 13 } 14 LL tmp = max(0LL,rest - sum[pos-1]); 15 int tnt = tmp/val[pos]; 16 if(tmp%val[pos]) ++tnt; 17 if(tnt <= ::cnt[pos]) dfs(rest - (LL)tnt*val[pos],pos - 1,cnt + tnt); 18 if(++tnt <= ::cnt[pos]) dfs(rest - (LL)tnt*val[pos],pos - 1,cnt + tnt); 19 } 20 int main(){ 21 int kase,money; 22 scanf("%d",&kase); 23 while(kase--){ 24 scanf("%d",&money); 25 for(int i = 1; i < maxn; ++i){ 26 scanf("%d",cnt + i); 27 sum[i] = sum[i - 1] + static_cast<LL>(cnt[i])*val[i]; 28 } 29 ret = -1; 30 dfs(money,10,0); 31 printf("%d ",ret); 32 } 33 return 0; 34 } 35 36