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 }