18143453325 在线咨询 在线咨询
18143453325 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > (DP) 代码源每日一题 Div1 货币系统

(DP) 代码源每日一题 Div1 货币系统

时间:2023-04-21 15:36:02 | 来源:网站运营

时间:2023-04-21 15:36:02 来源:网站运营

(DP) 代码源每日一题 Div1 货币系统:题目链接:Daimayuan Online Judge

题意:

思路:

我们先来考虑如何获得小t所需要的货币总数。

因为数据是有序的,我们可以从大到小来枚举。

int cal(int x) { int id = n; int cot = 0; while (x) { while (a[id] > x)id--; cot += x / a[id]; x -= x / a[id] * a[id]; } return cot;}最少货币数可以通过完全背包来获得,问题是背包的容量。

这里我猜了一发结论,就是枚举1 到 20000 所需要的货币数即可,然后就交了一发,过了。

但是正确性我不会证明,但是感觉这样很对(qwq

而且好像大家都是这样做的。

等晚上官方题解出了,我再补一个证明吧。

code

int cal(int x) { int id = n; int cot = 0; while (x) { while (a[id] > x)id--; cot += x / a[id]; x -= x / a[id] * a[id]; } return cot;}void slove() { cin >> n; for (int i = 1; i <= n; i++)cin >> a[i]; for (int i = 0; i <= 20000; i++)f[i] = INF; f[0] = 0; for (int i = 1; i <= n; i++) { for (int j = 0; j <= 20000; j++) { f[j + a[i]] = min(f[j + a[i]], f[j] + 1); } } for (int i = 1; i <= 20000; i++) { if (f[i] != cal(i)) { NO; return; } } YES;}

关键词:货币,系统

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭