目录
拖鞋言:本来这篇是打算更练习题的,但是想想还是把背包学习了比较好。所以练习题放到下期。
01背包问题
问题:
问题思路:思路其实是和上一篇动态规划DP-优快云博客一致的哦。每一个物品都有两种选择,选或者不选。这道题的限制呢,是物品的容量不可超过背包容量。其次和上篇的大盗阿福一样,我们都是要求一个max(最大值)。
话不多说,先上图。
上图的逻辑其实与前篇内容的逻辑是一致的,只是需要注意图中画出的细节问题。(变换这些条件,就可以创造出很多看似不一样,实质却一样的题目——举一反三)
依旧按照视频里的思路,先来一个dfs暴力求解。
dfs:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,i,j;
int v[1005]; //存n个物体的体积
int w[1005]; //存n个物体的价值
//x表示第x个物体,spv表示背包剩余的容量
int dfs(int x,int spv)
{
if(x>n) return 0;
else{
if(spv < v[x])
{
return dfs(x+1,spv); //物体的容量大于背包的容量时,直接下一个
}else{
return max(dfs(x+1,spv),dfs(x+1,spv-v[x])+w[x]);
}
}
}
int main()
{
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d %d",&v[i],&w[i]);
}
int res =dfs(1,m);
printf("%d",res);
}
接下来老样子,记忆化搜索。
记忆化搜索:
#include<iostream>
#include<algorithm>
#