0、1背包,直接做会超时。做了这题我才知道,01背包是能用搜索做的,搜索的时候剪枝很重要。

(几个月后……)

光棍节前夕,小T同志来找我,说他遇到了一个题解,里面说是受别人代码的启发,并附上原址,点开一看,居然是我?!我姓福了。真的很感谢这位兄弟,他尊重产权,更重要的是给了我信心。本来我都快要放弃了,现在我又坚定了信念,一定要好好搞下去。说实话,他的博客写得比我好,因为他详细地写出了思路。这时候小T 吐槽了:“其实你也是抄的。”好吧,我受之有愧,我是参考了江财大牛的思路,不过我的代码已经和他的不一样了,核心部分DFS做了逻辑上的改动。

 1 #include <stdio.h>
 2 #include <algorithm>
 3 using namespace std;
 4 int m,n,ans;
 5 int a[35];
 6 bool cmp(int a,int b)
 7 {
 8     return a > b ;
 9 }
10 void dfs(int i,int sum)
11 {
12     int j,k;
13     //printf("%d %d\n",i,sum);
14     if(ans == m) return;//相当于if(find)
15     if(sum > ans) ans = sum;
16     if(i >= n) return ;
17     for(j = i, k = sum; j < n; j++)
18         k += a[j];
19     if(k <= ans) return;
20     if(sum+a[i] <= m)
21         dfs(i+1,sum+a[i]);
22     dfs(i+1,sum);
23 }
24 int main()
25 {
26     int i;
27     while(~scanf("%d%d",&n,&m))
28     {
29         for(i = ans = 0; i < n; i++)
30             scanf("%d",&a[i]),
31             ans += a[i];
32         if(ans <= m)
33         {
34             printf("%d\n",ans);
35             continue;
36         }
37         sort(a,a+n,cmp);
38         ans = 0;
39         dfs(0,0);
40         printf("%d\n",ans);
41     }
42     return 0;
43 }