标签:fast lin 测试数据 template cstring stream pac temp 金融
在一个10美元的商店里,所有东西都值10美元或更少。为了在出纳处更有效地为客户服务,需要以最少数量的硬币进行找零。
在这个问题中,您将使用不同的硬币提供给定的找零值。编写一个程序来计算每种硬币类型所需的硬币数量。
输入包括值v,硬币组n的大小以及每个硬币的面值f1,f2,...,fn。输出是数字列表,即c1,...,cn,表示每种硬币类型所需的硬币数量。更改可能有很多方法。 v值是一个满足0 <v≤2000的整数,表示所需的更改
分。硬币的面值小于或等于10000。程序的输出应采用所需硬币数量最少的组合。
例如,由香港金融管理局发行的香港硬币包括10美分,20美分,50美分,1美元,2美元,5美元和10美元,在输入中表示为n = 7,f1 = 10 ,f2 = 20,f3 = 50,f4 = 100,f5 = 200,f6 = 500,f7 = 1000。
输入
测试数据可能包含许多测试用例,请处理到文件末尾。
每个测试用例的一行中都包含整数v,n,f1,...,fn。保证n≤10且0 <f1 <f2 <... <fn。
输出
输出是一行中的n个数字,以空格分隔。如果没有可能的更改,则您的输出应为单个-1。如果可能的解决方案不止一种,则您的程序应输出使用更多面值较低的硬币的解决方案。
样例输入
2000 7 10 20 50100200500 1000
250 4 10 20 125150
35 4 10 20 125 150
48 4 1 8 16 20
40 4 1 10 13 37
43 5 1 2 21 40 80
样例输出复制
0 0 0 0 0 0 2
0 0 2 0
-1
0 1 0 2
3 0 0 1
1 1 0 1 0
#pragma GCC optimize(1) #pragma GCC optimize(2) #pragma GCC optimize(3,"Ofast","inline") #include<cstring> #include<cstdio> #include<iostream> #include<queue> #include<algorithm> using namespace std; typedef long long ll; template <typename Tp> void read(Tp &x){//read(n); x=0;char ch=1;int fh; while(ch!=‘-‘&&(ch>‘9‘||ch<‘0‘)){ ch=getchar(); } if(ch==‘-‘){ fh=-1;ch=getchar(); }else fh=1; while(ch>=‘0‘&&ch<=‘9‘){ x=(x<<1)+(x<<3)+ch-‘0‘;ch=getchar(); } x*=fh; } inline char read1()//字符串读入挂 { register char ch=getchar(); while(ch<‘A‘||ch>‘M‘)ch=getchar(); return ch; } const int maxn=1e6+100; const int mod=1000000007; const int INF=0x3f3f3f; int a[maxn]; int dp[maxn]; int vis[maxn]; int main(){ int m,n; while(cin>>m>>n){ memset(dp,0x3f3f,sizeof(dp)); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++){ cin>>a[i]; } dp[0]=0; for(int i=1;i<=n;i++){ for(int j=a[i];j<=m;j++){ dp[j]=min(dp[j],dp[j-a[i]]+1); } } if(dp[m]==0x3f3f3f3f){ printf("-1\n"); continue; } int z=m; int p=0; for(int i=n;i>=1;i--){ p=0; while(z-a[i]>=0&&dp[z]==dp[z-a[i]]+1){ vis[i]++; z-=a[i]; } } for(int i=1;i<=n;i++){ cout<<vis[i]<<" "; } cout<<endl; } }
标签:fast lin 测试数据 template cstring stream pac temp 金融
原文地址:https://www.cnblogs.com/lipu123/p/13768275.html