01背包问题(dfs+剪枝)

01背包问题

dfs解法

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <cmath>
 5 
 6 using namespace std ;
 7     
 8 const int N = 1010 ;
 9 
10 int v[N],w[N] ;
11 int n,V ;
12 int ans = 0 ;
13 
14 void dfs(int idx,int h,int m){
15     if(idx == n){
16         return ;
17     }
18     dfs(idx+1,h,m) ;//第一个分支表示不选当前物品
19     if(h+v[idx]<=V){//只有当前背包容量大于等于当前物品体积,才进入第二个分支
20         if(ans<m+w[idx]){
21             ans = m + w[idx] ;
22         }
23         dfs(idx+1,h+v[idx],m+w[idx]) ;
24     }
25 }
26 
27 int main(){
28     cin >> n >> V ;
29     
30     for(int i=0;i<n;i++){
31         cin >> v[i] ;
32     }
33     for(int i=0;i<n;i++){
34         cin >> w[i] ;
35     }
36     
37     dfs(0,0,0) ;
38     
39     cout << ans << endl ;
40     
41     return 0 ;    
42 } 

...

猜你喜欢

转载自www.cnblogs.com/gulangyuzzz/p/12056152.html