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 }
posted @ 2012-07-21 15:59  Naix_x  阅读(188)  评论(0编辑  收藏  举报