Watashi's BG(01背包思想+深搜+剪枝)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3631

0MS:

View Code
 1 #include<stdio.h>
 2 #include<algorithm>
 3 using namespace std ;
 4 int a[31] ;
 5 int n, m, ans ;
 6 void dfs(int i, int v)
 7 {
 8     if(ans==m)
 9     return ;
10     if(v>m)
11     return ;
12     if(i<1)
13     {
14         ans = max(ans, v) ;
15         return ;
16     }
17     int j, sum = v ;
18     for(j=i; j>=1; j--)
19     sum += a[j] ;
20     if(sum<ans)
21     return ;
22     dfs(i-1, v+a[i]) ;
23     dfs(i-1, v) ;
24 }
25 int main()
26 {
27     int i ;
28     while(scanf("%d%d",&n, &m)!=EOF)
29     {
30         for(i=1; i<=n; i++)
31         scanf("%d", &a[i]) ;
32         sort(a+1, a+1+n) ;
33         ans = 0 ;
34         dfs(n, 0) ;
35         printf("%d\n", ans) ;
36     }
37     return 0 ;
38 }

 840MS:

View Code
 1 #include<stdio.h>
 2 #include<algorithm>
 3 using namespace std ;
 4 int w[31];
 5 int m,n;
 6 int ans;
 7 void dfs( int k, int sum )
 8 {
 9     if( ans == m )
10         return ;
11     if( ans < sum )
12         ans = sum;
13         for( int i=k; i<n&&w[i]+sum<=m; i++ )
14         {
15             dfs( i+1, sum+w[i] );
16         }
17 }
18 int main()
19 {
20     while( scanf( "%d%d", &n,&m ) != EOF )
21     {
22         ans = 0;
23         for( int i=0; i<n; i++ )
24         {
25             scanf( "%d", &w[i] );
26             ans += w[i];
27         }
28         if( ans <= m )
29         {
30             printf( "%d\n", ans );
31         }
32         else
33         {
34             sort( w, w+n );
35             ans = 0;
36             dfs( 0,0 );
37             printf( "%d\n",ans );
38         }
39     }
40     return 0;
41 }
原文地址:https://www.cnblogs.com/yelan/p/2992339.html