Description
2002年1月1日,荷兰和其他几个欧洲国家放弃了本国货币,转而使用欧元。这改变了付款的便利性,而不仅仅是在国际上。
在1月1日之前购买68盾的学生可以用一张50盾的钞票和两张10盾的钞票来支付这本书,从而获得了2盾的兑换。简而言之:50 + 10 + 10-1-1 =68。其他付款方式是:50 + 25-5-1-1或100-25-5-1-1。这两种方式始终有5个单位(钞票或硬币)参与支付过程,并且不能少于5个单位。
如今,购买一本68欧元的书更容易:50 + 20-2 = 68,因此只涉及3个单位。这不是巧合;在许多其他情况下,用欧元付款比用荷兰盾付款更有效。平均而言,欧元更有效率。当然,这与欧元的价值无关,但与选择的单位无关。荷兰盾的单位通常为:1、2.5、5、10、25、50,而欧元的单位为:1、2、5、10、20、50。
对于此问题,我们将自己限制为最多100美分。欧元的硬币面值为1、2、5、10、20、50欧分。在支付[1,100]欧分范围内的任意金额时,平均涉及2.96个硬币,无论是付款还是找零。从这个意义上讲,欧元系列并不是最佳选择。使用硬币1、24、34、39、46、50,可以使用两个硬币支付68美分。支付[1,100]范围内的金额所涉及的平均硬币数量为2.52。
但是,后一个系列的计算更为复杂。也就是说,心理计算。这些计算可以很容易地在如今几乎每个人都随身携带的任何手机中进行编程。为未来做准备,欧洲中央银行委员会正在研究一系列硬币的效率,以找到最有效的系列硬币,最高金额为100欧分。他们需要您的帮助。
编写一个程序,给定一系列硬币,计算出支付不超过100美分的任何金额所需的平均和最大硬币数。您可能会假设双方都拥有足够数量的任何硬币。
Format
Input
输入的第一行包含测试用例的数量。每个测试用例在一行上用6个不同的正整数描述:硬币的值,按升序排列。第一个数字始终为1。最后一个数字小于100。.
Output
对于每个测试用例,输出是一条单行,其中首先包含平均值,然后是涉及支付[1,100]范围内的金额的最大硬币数量。这些值用空格分隔。如示例中所示,平均值应始终包含小数点后两位。最大值始终是整数。
Samples
输入数据 1
3
1 2 5 10 20 50
1 24 34 39 46 50
1 2 3 7 19 72
Copy
输出数据 1
2.96 5
2.52 3
2.80 4
Copy
Limitation
1s, 1024KiB for each test case.
思路
首先看题目,知道这道题要问支付不超过100美分的任何金额所需的平均和最大硬币数。
那么,再看数据,发现它和背包问题相近,只是有负数。
这就好办了,直接在背包里加个负数不就行了。
代码见下:
#include<bits/stdc++.h>
using namespace std;
long long eee,n,m,jkj,lll=0,n17,u23,s2[10000001],ni[120][101],nj[101],nk[101],b[100001],c[54],d[100001],k,kkk,p,ss[100001][51],sd[100001],sw,t,z0,z1,u0,sc,s0,sm,sx,qw23,a[100001];
long long n8[1001][101],n4[1010012],q[1000001];
double qww;
int main(){
cin>>qw23;
for(long long op=1;op<=qw23;op++){
for(long long i=1;i<=11;i+=2){
cin>>a[i];
a[i+1]=-a[i];
}
memset(q,63,sizeof(q));
q[0]=0;
sx=0;
sm=-1;
while(1){
s0=0;
for(long long i=1;i<=12;i++){
for(long long j=200;j>=0;j--){
if(q[j]+1<q[j+a[i]]&&j+a[i]<=200&&q[j]+1<=104400&&j+a[i]>=0){
q[j+a[i]]=q[j]+1;
s0=1;
}
}
}
if(s0==0) break;
}
for(long long i=1;i<=100;i++){
sx+=q[i];
sm=max(sm,q[i]);
}
qww=sx;
qww/=100.0;
cout<<fixed<<setprecision(2)<<qww<<" ";
cout<<sm<<endl;
}
return 0;
}