POJ 1252

题意:给6种不同面额硬币,求组成[1,100]中数的平均需要硬币与最多需要硬币数,可以通过减法获得,比如有1、4两种硬币,凑成3可以用4-1两个硬币完成,而不是1+1+1三个硬币。

题解:背包问题,由于可以减,还需要反过来dp一遍,值得注意的是上界需要设成2000才行。

View Code
 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 using namespace std;

 5 int dp[2050];

 6 void update(int v)

 7 {

 8     if(v>0)

 9         for(int i=0;i+v<=2000;i++)

10             dp[i+v]=min(dp[i+v],dp[i]+1);

11     else

12         for(int i=2000;i+v>=0;i--)

13             dp[i+v]=min(dp[i+v],dp[i]+1);

14 }

15 int main()

16 {

17     int T;

18     for(scanf("%d",&T);T;T--)

19     {

20         dp[0]=0;

21         for(int i=1;i<=2000;i++)

22             dp[i]=100000;

23         int a[10];

24         for(int i=0;i<6;i++)

25             scanf("%d",a+i),update(a[i]);

26         for(int i=0;i<6;i++)

27             update(-a[i]);

28         int ans=0,num=0;

29         for(int i=1;i<=100;i++)

30             ans+=dp[i],num=max(num,dp[i]);

31         printf("%.2lf %d\n",ans/100.0,num);

32     }

33     return 0;

34 }

你可能感兴趣的:(poj)