连接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 }