目录
前言
这是一道经典的01背包问题,涉及动态规划,即每一步都具有后效性,会影响后面的步骤,因此不能采用贪心思想。解决此题有2种方法,分别采用一维数组和二维数组,此解法采用的是一维数组,能节约大量空间,属于其中较优的一种解法。
题目(链接)
样例
代码
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
inline ll read() //快读模板
{
ll x=0, j=1; char ch = getchar();
while (!isdigit(ch))
{
if (ch == '-')j = -1;
ch = getchar();
}
while(isdigit(ch))
{
x = x * 10 + ch - '0';
ch = getchar();
}
return x * j;
}
int main()
{
ll m=read(), n=read(),w[105]={0}, v[105] = {0}, g[20005] = {0};
for (int i = 1; i <= n; i++)//输入物品的重量和价值
{
w[i] = read();
v[i] = read();
}
for (int i = 1; i <= n; i++)//01背包模板
{
for (int j = m; j >= w[i]; j--)
{
g[j] = max(g[j], g[j - w[i]] + v[i]);
}
}
cout <<g[m];
return 0;
}
通过情况
注意事项
1.数组最好全部初始化
2.背包模板要分清各个变量的含义