简单DP 01 背包 饭卡HDU 2546 ( 饭卡 ) 不知道算不算是稍稍加了点贪心的思想~

连接http://acm.hdu.edu.cn/showproblem.php?pid=2546

这道题一开始我想错了以为是贪心。。。

当时看到这道题的思路就是首先要-5然后用DP最后用看剩下来谁最大就买谁~

后来实在不知道应该怎么处理,终不能用VIS来跟踪标记把= =。。。然后觉得思路错了, 应该是吧最大的那个菜留到最后再买~

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 /*int cmp(const void *a,const void *b)
 4 {
 5     return a-b;
 6 }*/
 7 int main()
 8 {
 9     int t,n,i,j;
10     int dp[10005],val[1005];
11     int sum;
12     while(scanf("%d",&n)&&n)
13     {
14         int maxi = 0;
15         for(i = 0;i < n;i++)
16         {
17             scanf("%d",val+i);
18             if(val[maxi] < val[i])
19             maxi = i;
20         }
21 
22         scanf("%d",&sum);
23        // qsort(val,n,sizeof(int),cmp);
24        if(sum >= 5)
25        {
26            memset(dp,0,sizeof(dp));
27             for(i = 0;i < n;i++)
28             {
29                 if(i != maxi)
30                 for(j = sum-5;j >= val[i];j--)
31                 if(dp[j] < dp[j-val[i]]+val[i])
32                 dp[j] = dp[j-val[i]]+val[i];
33             }
34             printf("%d\n",sum-dp[sum-5]-val[maxi]);
35        }
36        else
37        printf("%d\n",sum);
38     }
39     return 0;
40 }
原文地址:https://www.cnblogs.com/0803yijia/p/2638908.html