01背包难理解?小白带你学明白!
作者:互联网
每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到而不管之前这个状态是如何得到的->动态规划。
······今晚闲的无聊,学了师兄叫学的01背包问题,刚开始看到是动态规划来的,就觉得十分难,根本不想动,后面冷静用手动模拟了一下,发现动态规划太牛b了(因为用电脑调试实在看不懂),首先动态规划是什么,大概在初学的我来看,每个 dp[i][j] 都代表一个状态(i:背包所需要的东西,j:背包的容量),此刻的状态=max(上一次装入背包的状态 | | 前一个可以得到这个状态的背包+这个物品的价值 )
······· 就随便举个例子吧 比如说我现在这个背包容量为8,现在有一个重 2 和 5 和 6的物品 ,它可以是装(2)(5)(6)(2,5)(2,6),现在我们分析(2,6),它就是从背包(2)的状态+重6的石头,因为它不可能从(5)这个状态到(5,8),明显超出重量,大家可以看看我们下面一道背包模板题+小注释,你绝对明白,不明白私聊我o
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node {
int v,w;
}bag[1011];
int t,n,m,dp[1011][1011];
int ans(){
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++){
if(bag[i].w>j)//每个dp[i][j]代表i个物品,j容量所表示当前价值的状态
dp[i][j]=dp[i-1][j];
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-bag[i].w]+bag[i].v);
// dp[i-1][j]: 没有装第i个物品的价值
// dp[i-1][j-op[i].w: 没有装第i个物品且还有空间装第i个物品的价值
//printf("op[i].b = %d i = %d j = %d dp[i-1][j] = %d dp[i][j] = %d \n",op[i].b,i,j,dp[i-1][j] ,dp[i][j]);调试
}
return dp[n][m];
}
int main()
{
freopen("888.txt","r",stdin);
cin>>t;
while(t--){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>bag[i].v;
for(int i=1;i<=n;i++)cin>>bag[i].w;
cout<<ans()<<"\n";
/*for(int i=0;i<=n;i++){///调试
for(int j=0;j<=m;j++)
printf("%5d",dp[i][j]);
cout<<"\n";
}*/
}
return 0;
}
标签:状态,01,你学,int,bag,白带,include,背包,dp 来源: https://blog.csdn.net/weixin_52068490/article/details/114858537