HDU 2546 饭卡(贪心+DP)

题目链接

 几个月之前做的一个题了,开始想时就看出应该是个01背包问题,又发现不太一样,貌似应该是有种贪心策略,把最大的挑出来最后还有5块钱的再买,剩下的体积用01背包去求最优选择,当时WA了3次,以为算法有问题,难道用o(n^3)算法吗。。枚举每一种物品然后用01背包的取得的最优解+物品的价值,然后最后找最大的。。感觉复杂度有点高啊。。。然后就放下了,今天又想起来了,搜了下题解,原来是饭卡开始的时候<5 的时候 情况漏了。。。。我晕。。。。

 1 #include<stdio.h>

 2 #include<string.h>

 3 int p[1001],k[1001];

 4 int main()

 5 {

 6     int a,b,c,d,max,i,max1;

 7     while(scanf("%d",&a)!=EOF)

 8     {

 9         memset(k,0,sizeof(k));

10         if(a==0)break;

11         max=0;

12         d=1;

13         for(b=1; b<=a; b++)

14         {

15             scanf("%d",&p[b]);

16             if(max<p[b])

17             {

18                 max=p[b];

19                 d=b;

20             }

21         }

22         scanf("%d",&c);

23         for(b=1; b<=a; b++)

24         {

25             if(b!=d)

26             {

27                 for(i=c-5; i>=p[b]; i--)

28                 {

29                     if(k[i]<k[i-p[b]]+p[b])

30                         k[i]=k[i-p[b]]+p[b];

31                 }

32             }

33         }

34         max1=0;

35         for(b=1; b<=c-5; b++)

36         {

37             if(max1<k[b])

38                 max1=k[b];

39         }

40         if(c >= 5)//少了这个判断。。。

41         printf("%d\n",c-max1-max);

42         else

43         printf("%d\n",c);

44     }

45     return 0;

46 }

你可能感兴趣的:(HDU)