完全背包
完全背包
分析:
解决完全背包游两个思路
1、利用单维数组前面结果后后面结果的影响从而实现每样物品取多件的效果
2、利用分组背包的思想,枚举每个物品取1->k件的效果
1、完全背包(单数组优化)
1 //f[j]表示前i件物品花费j元的最大价值 2 //f[j]=max(f[i-1][j],f[i-1][j-w[i]]+c[i]) 3 //f[j]=0 4 5 #include <bits/stdc++.h> 6 using namespace std; 7 int f[105]; 8 int m,n; 9 int w[105],c[105]; 10 11 int main(){ 12 freopen("in2.txt","r",stdin); 13 //初始化dp 14 memset(f,0,sizeof(f)); 15 cin>>m>>n; 16 for(int i=1;i<=n;i++){ 17 cin>>w[i]>>c[i]; 18 } 19 20 21 for(int i=1;i<=n;i++){ 22 for(int j=1;j<=m;j++){ 23 if(j>=w[i]){ 24 f[j]=max(f[j],f[j-w[i]]+c[i]); 25 } 26 } 27 } 28 cout<<f[m]<<endl; 29 30 return 0; 31 }
2、完全背包(分组背包单数组优化)
k是在状态转移方程里面的
j的向前或者是向后只和维数相关
1 //f[j]表示前i件物品花费j元的最大价值 2 //f[j]=max(f[j],f[j-w[i]*k]+c[i]*k); 3 //f[j]=0 4 5 #include <bits/stdc++.h> 6 using namespace std; 7 int f[105]; 8 int m,n; 9 int w[105],c[105]; 10 11 12 int main(){ 13 freopen("in2.txt","r",stdin); 14 //初始化dp 15 memset(f,0,sizeof(f)); 16 cin>>m>>n; 17 for(int i=1;i<=n;i++){ 18 cin>>w[i]>>c[i]; 19 20 } 21 22 23 //k是在状态转移方程里面的 24 //j的向前或者是向后只和维数相关 25 26 for(int i=1;i<=n;i++){ 27 for(int j=m;j>=1;j--){ 28 int num=m/w[i]; 29 for(int k=1;k<=num;k++){ 30 if(j>=w[i]*k){ 31 f[j]=max(f[j],f[j-w[i]*k]+c[i]*k); 32 } 33 } 34 } 35 } 36 cout<<f[m]<<endl; 37 38 return 0; 39 } 40 41 42 //单数组 43 //可以边读入边动态规划么 44 //01背包的分组背包 45 //01背包的分组背包的一维数组优化