HDOJ 2546(01背包)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 using namespace std;
10 int dp[1005];
11 int main(int argc, char *argv[])
12 {
13     int n,w[1010],m;
14     while(scanf("%d",&n)!=EOF)
15     {
16         if(n==0)
17         break;
18         for(int i=0;i<n;i++)
19             scanf("%d",&w[i]);
20         scanf("%d",&m);
21         if(m<5)
22         {
23             printf("%d\n",m);
24             continue;
25         }
26         
27         memset(dp,0,sizeof(dp));
28         sort(w,w+n);
29         m-=5;
30         for(int i=0;i<n-1;i++)
31             for(int j=m;j>=w[i];j--)
32                 dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
33         printf("%d\n",m-dp[m]+5-w[n-1]);
34     }
35     return 0;
36 }

猜你喜欢

转载自www.cnblogs.com/huluxin/p/9656407.html