徹底揹包問題

 徹底揹包問題ios

 

輸入樣例

4 5 1 2 2 4 3 4 4 5

輸出樣例:





二維暴力寫法:


10
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<map>
 7 #include<set>
 8 #include<vector>
 9 #include<sstream>
10 using namespace std; 11 #define ll long long
12 const int inf=99999999; 13 const int mod=1e9+7; 14 
15 const int maxn=1000+10; 16 
17 int value[maxn];//價值 
18 int capacity[maxn];//體積 
19 
20 int dp[1010][maxn];//徹底揹包 
21 
22 int main() 23 { 24     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 25    
26     int n,v;//n件物品,最大容量v 
27     cin>>n>>v; 28     
29     for(int i=0;i<n;i++) 30         cin>>capacity[i]>>value[i]; 31     
32     memset(dp,0,sizeof(dp)); 33     
34     for(int i=0;i<n;i++) 35  { 36         for(int j=0;j<=v;j++) 37  { 38             for(int k=0;k*capacity[i]<=j;k++) 39  { 40                 dp[i+1][j]=max(dp[i+1][j],dp[i][j-k*capacity[i]]+k*value[i]); 41  } 42  } 43  } 44     
45     cout<<dp[n][v]<<endl; 46     
47     return 0; 48 }
 

 

 

二維優化寫法:


 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<map>
 7 #include<set>
 8 #include<vector>
 9 #include<sstream>
10 using namespace std; 11 #define ll long long
12 const int inf=99999999; 13 const int mod=1e9+7; 14 
15 const int maxn=1000+10; 16 
17 int value[maxn];//價值 
18 int capacity[maxn];//體積 
19 
20 int dp[1010][maxn];//徹底揹包 優化 
21 
22 int main() 23 { 24     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 25    
26     int n,v;//n件物品,最大容量v 
27     cin>>n>>v; 28     
29     for(int i=0;i<n;i++) 30         cin>>capacity[i]>>value[i]; 31     
32     memset(dp,0,sizeof(dp)); 33     
34     for(int i=0;i<n;i++) 35  { 36         for(int j=0;j<=v;j++) 37  { 38             if(j<capacity[i]) 39                 dp[i+1][j]=dp[i][j]; 40             else
41  { 42                 if(dp[i][j]>dp[i+1][j-capacity[i]]+value[i]) 43                     dp[i+1][j]=dp[i][j]; 44                 else
45                     dp[i+1][j]=dp[i+1][j-capacity[i]]+value[i]; 46  } 47  } 48  } 49     
50     cout<<dp[n][v]<<endl; 51     
52     return 0; 53 }

 

 

一維優化寫法:優化

 

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<map>
 7 #include<set>
 8 #include<vector>
 9 #include<sstream>
10 using namespace std; 11 #define ll long long
12 const int inf=99999999; 13 const int mod=1e9+7; 14 
15 const int maxn=1000+10; 16 
17 int value[maxn];//價值 
18 int capacity[maxn];//體積 
19 
20 int dp[maxn];//徹底揹包 一維優化 
21 
22 int main() 23 { 24     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 25        
26        int n,v;//n件物品,最大容量v 
27     cin>>n>>v; 28     
29     for(int i=0;i<n;i++) 30         cin>>capacity[i]>>value[i]; 31     
32     memset(dp,0,sizeof(dp)); 33     
34     for(int i=0;i<n;i++) 35  { 36         for(int j=capacity[i];j<=v;j++) 37  { 38             //if(j>=capacity[i])//由循環,j必定大於等於capacity[i] 
39             dp[j]=max(dp[j],dp[j-capacity[i]]+value[i]); 40  } 41  } 42     
43     cout<<dp[v]<<endl; 44     
45     return 0; 46 }
相關文章
相關標籤/搜索