题目大意
每周需要x元钱 给你n种钱币 每种钱币的金额为 v 数量为num 注:每一个面额都能整除所有比它大的面额。
不能找钱!!!
题目思考
就像我们平时买东西一样,先用大钱币支付。之后再考虑如何组合的问题。
组合的话 用 相对大的钱币 和 相对小的钱币组合 来减少浪费。
代码实现让我冥思苦想,最后借鉴了hzwer大佬的代码。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,c,ans; struct data{ int v,b; friend bool operator<(data a,data b){ return a.v<b.v; } }a[25]; int main() { scanf("%d%d",&n,&c); for(int i=1;i<=n;i++) { scanf("%d%d",&a[i].v,&a[i].b); if(a[i].v>=c) ans+=a[i].b,a[i].b=0; } sort(a+1,a+n+1); int now=9999999; while(1) { now=0; for(int i=n;i;i--) while(a[i].v+now<c&&a[i].b) { now+=a[i].v,a[i].b--; //printf("%d\n",now); } for(int i=1;i<=n;i++) if(a[i].b) { now+=a[i].v,a[i].b--; break; } //printf("%d\n",a[2].b); if(now>=c)ans++; else break; } printf("%d\n",ans); return 0; }
代码实现
时间: 2024-10-22 18:11:19