题意:由给定的6个数组成【1,100】中的每个数,(第一个数字是1)找出每个数的最少组合,让你求平均组合数和最大组合数
可以有负值:完全背包
//C++
#include<iostream>
#include<algorithm>
#include<cstdio>
#define max 10010
using namespace std;
int dp[max];
int num[13];
int T;
int min(int a,int b)
{
return a>b?b:a;
}
int main()
{
int Max,ans,M;
scanf("%d",&T);
while(T--)
{
ans=0;
for(int i=0; i<=10; i+=2)
{
scanf("%d",&num[i]);
num[i+1]=-num[i];
}
M=num[10]*101;//由于有负值
for(int i=0; i<max; i++)
dp[i]=max*max;
dp[0]=0;
for(int i=0; i<12; i+=2)
for(int j=num[i]; j<=M; j++)
{
dp[j]=min(dp[j],dp[j-num[i]]+1);
}
for(int i=1; i<12; i+=2)
for(int j=M+num[i]; j>=0; j--)
{
dp[j]=min(dp[j],dp[j-num[i]]+1);
}
Max=-1;
for(int i=1; i<=100; i++)
{
if(Max<dp[i])
Max=dp[i];
ans+=dp[i];
}
printf("%.2lf %d\n",ans/100.0,Max);
}
return 0;
}