用六种钱币,去支付[1,100]的钱,求用的张数最小,求其平均值和最大值。。。。
这个题目就是完全背包的问题,一看估计都会想到动规方程,钱数可以加减得到。开始我的数组只开到108,错了也不知道错在哪。。。
后来在讨论区里面看见了,涉及钱数的最大值可能会比较大,比如(1,95,96,97,98,99),结果是(12.29,25)。还是 比较大的,其实开个2000就可以了把!!!
所以以后做题目要注意点吧!!!
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[2003];
int main(){
int q[8];
int n,i,j,sum,maxx;
double age;
scanf("%d",&n);
while(n--){
for(i=1;i<=6;i++) scanf("%d",&q[i]);
for(i=0;i<=2001;i++) dp[i]=99999999;
dp[0]=0;
for(i=1;i<=6;i++){
for(j=q[i];j<=2000;j++){
if(dp[j-q[i]] != 99999999)
dp[j]=min(dp[j],dp[j-q[i]]+1);
}
}
for(i=1;i<=6;i++){
for(j=2000-q[i];j>=0;j--){
if(dp[j+q[i]] != 99999999)
dp[j]=min(dp[j],dp[j+q[i]]+1);
}
}
sum=maxx=0;
for(i=1;i<=100;i++){
sum+=dp[i];
if(dp[i] >maxx) maxx=dp[i];
}
age=(double)sum/100;
printf("%0.2f %d\n",age,maxx);
}
return 0;
}
路途中。。。。。