【背包】0-1背包与完全背包一维数组实现

背包问题很经典了,《背包问题九讲》讲的非常详细,建议看一看。

在这里,我想给出0-1背包和完全背包压缩空间后的实现,即只要一维数组。

0-1背包,与完全背包仅仅只是内循环的次序不同,故而代码基本相同。

希望可以帮的上你。

0-1背包:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int f[1001];
 4 int w[1001]; 
 5 int v[1001];
 6 int main(){
 7     int n;
 8     int W;
 9     cin>>n>>W;
10     for(int i = 1;i<=n;i++){
11         cin>>w[i]>>v[i];
12     }
13     memset(f,-10000000,sizeof(f));
14     for(int i = 1;i<=n;i++){
15         for(int j = W;j>=0;j--){
16             f[j] = max(f[j],f[j-w[i]]+v[i]);
17         }
18     }
19     int max = 0;
20     for(int i = 1;i<=n;i++){
21         if(f[i]>max){
22             max = f[i];
23         }
24     }
25     printf("%d",max);
26 }


完全背包:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int f[1001];
 4 int w[1001]; 
 5 int v[1001];
 6 int main(){
 7     int n;
 8     int W;
 9     cin>>n>>W;
10     for(int i = 1;i<=n;i++){
11         cin>>w[i]>>v[i];
12     }
13     memset(f,-10000000,sizeof(f));
14     for(int i = 1;i<=n;i++){
15         for(int j = 0;j<=W;j++){
16             f[j] = max(f[j],f[j-w[i]]+v[i]);
17         }
18     }
19     int max = 0;
20     for(int i = 1;i<=n;i++){
21         if(f[i]>max){
22             max = f[i];
23         }
24     }
25     printf("%d",max);
26 }

  

原文地址:https://www.cnblogs.com/duye/p/8681516.html