完全背包
完全背包
分析:
解决完全背包游两个思路
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背包的分组背包的一维数组优化
版权申明:欢迎转载,但请注明出处
一些博文中有一些参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。
在校每年国奖、每年专业第一,加拿大留学,先后工作于华东师范大学和香港教育大学。
2025-04-30:宅加太忙,特此在网上找女朋友,坐标上海,非诚勿扰,vx:fan404006308
AI交流资料群:753014672