2018.02.06
背包专卖店系列
今天我们学习了背包问题,浏览了一个规模宏大的背包专卖店。。。领略了许许多多的背包。
01背包
完全背包
多重背包
混合背包
部分背包
二维费用背包
分组背包
有依赖背包
1. 01背包
思路:。。。
核心代码:
1 #include <stdio.h> 2 #include <math.h> 3 #include <string.h> 4 int w[101],c[101]; 5 int f[101][1001]; 6 int _Max(int x,int y){return x>y?x:y;} 7 int main(){ 8 int n,m; 9 int i,j,v; 10 scanf("%d%d",&m,&n); 11 for(i=1;i<=n;i++) 12 scanf("%d%d",&w[i],&c[i]); 13 for(i=1;i<=n;i++) 14 for(v=m;v>0;v--) 15 if(w[i]<=v) f[i][v]=_Max(f[i-1][v],f[i-1][v-w[i]]+c[i]); 16 else f[i][v]=f[i-1][v]; 17 printf("%d\n",f[n][m]); 18 return 0; 19 }
状态:AC
2.完全背包
思路:。。。
核心代码:
1 #include <stdio.h> 2 #include <math.h> 3 #include <string.h> 4 int m,n; 5 int w[31],c[31]; 6 int f[31][201]; 7 int main(){ 8 int i,j,v; 9 scanf("%d%d",&m,&n); 10 for(i=1;i<=n;i++) 11 scanf("%d%d",&w[i],&c[i]); 12 for(i=1;i<=n;i++){ 13 for(v=1;v<=m;v++){ 14 if(v<w[i]) 15 f[i][v]=f[i-1][v]; 16 else if(f[i-1][v]>f[i][v-w[i]]+c[i]) 17 f[i][v]=f[i-1][v]; 18 else f[i][v]=f[i][v-w[i]]+c[i]; 19 } 20 } 21 printf("%d",f[n][m]); 22 return 0; 23 }
状态:AC
3.多重背包
思路:。。。
核心代码:
1 #include <stdio.h> 2 #include <math.h> 3 #include <string.h> 4 int v[6002],w[6002],s[6002]; 5 int f[6002]; 6 int m,n; 7 int _Max(int x,int y){return x>y?x:y;} 8 int main(){ 9 int i,j; 10 scanf("%d%d",&n,&m); 11 for(i=1;i<=n;i++) 12 scanf("%d%d%d",&v[i],&w[i],&s[i]); 13 for(i=1;i<=n;i++){ 14 for(j=m;j>=0;j--) 15 for(int k=0;k<=s[i];k++){ 16 if(j-k*v[i]<0)break; 17 f[j]=_Max(f[j],f[j-k*v[i]]+k*w[i]); 18 } 19 } 20 printf("%d",f[m]); 21 return 0; 22 }
状态:AC