日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 5527:Too Rich(DFS+贪心)***

發布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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+贪心)***的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。