一、完全背包
例题
![](https://img-blog.csdnimg.cn/img_convert/676b2b85bb904e755dbab906d36ecbf6.png)
![](https://img-blog.csdnimg.cn/img_convert/99b6db971734dd3a2f4e939b0355b542.png)
思路
这道题使用二维dp显然超时超空间,考虑优化dp使用一维
#include<iostream>
using namespace std;
const int N=1e4+10,M=1e7+10;//M数据最大为1e4,T数据最大为1e7,开一个比数据范围大一点的数组
long long f[M];//如果开二维dp数据最大为1e11,会爆int
int m, n,v[N],w[N];
int main()
{
cin >> m>>n;
for (int i = 1; i <= n; i++)
{
cin >> v[i] >> w[i];
}//输入数据
for (int i = 1; i <= n; i++)//枚举物品
{
for (int j = v[i]; j <= m; j++)//枚举体积,从大到小枚举
{
f[j] = max(f[j], f[j - v[i]]+ w[i]);//利用上一个来计算下一个选取几个物品
}
}
cout << f[m];
return 0;
}