徹底揹包問題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 }