HDU 5527:Too Rich(DFS+贪心)***
生活随笔
收集整理的這篇文章主要介紹了
HDU 5527:Too Rich(DFS+贪心)***
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
題意
給出p塊錢,現在要用十種硬幣湊出,每種硬幣有c[i]個,問最多能用多少個硬幣。
思路
首先確定,對于每個硬幣就是能用小的替換就不用大的。
所以,可以先把硬幣盡量用小的替換,如果小的不夠用,再用大的去替換。
根據這個思路,就可以處理出一個前 i 個硬幣總價值的前綴和 pre[],從大的面額到小面額去枚舉,當前這種面額的硬幣至少需要使用 (sum - pre[i-1]) / val[i] 種,sum代表當前還剩下多少錢要去兌換,這個數要向上取整,然后繼續dfs下去就可以了。
還有一種情況,就是20和50的情況和200和500的情況,即20不能整除50,那么對于p=60,3個20硬幣,1個50硬幣這種樣例就不能去用這種方法解決了。一個比較好的做法就是讓這種硬幣多用一個,讓它的使用數量變成偶數,就可以被整除了。
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> pii; const int INF = 0x3f3f3f3f; const int N = 15; int val[] = {0, 1, 5, 10, 20, 50, 100, 200, 500, 1000, 2000}; int c[N], ans, pre[N];void dfs(int sum, int num, int rem) {if(sum < 0) return ;if(rem == 0) {if(sum == 0) ans = max(ans, num);return ;}int tol = max(sum - pre[rem-1], 0); // 前面的硬幣足夠的話,就不使用現在的硬幣int cur = (tol + val[rem] - 1) / val[rem]; // 向上取整if(cur <= c[rem]) dfs(sum - cur * val[rem], num + cur, rem - 1);cur++; // 當前面整除不了,需要多用一個,變成前面某一個的倍數,例如50和20,500和200if(cur <= c[rem]) dfs(sum - cur * val[rem], num + cur, rem - 1); }int main() {int t; scanf("%d", &t);while(t--) {int p; scanf("%d", &p);pre[0] = 0; ans = -1;for(int i = 1; i <= 10; i++)scanf("%d", &c[i]), pre[i] = pre[i-1] + c[i] * val[i];dfs(p, 0, 10);printf("%d\n", ans);}return 0; }轉載于:https://www.cnblogs.com/fightfordream/p/7676746.html
總結
以上是生活随笔為你收集整理的HDU 5527:Too Rich(DFS+贪心)***的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小程序之旅——第六站(模板首页)
- 下一篇: Docker(十二):Docker集群管