#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn = 1010;
#define INF 65535
int w[maxn], v[maxn];
int main()
{
//关于f数组的初始化:当题目求的是恰好为r容量时的最大价值,则将F[0]初始化为0,其他的为-INF,此时最大值为max(f数组)
//当题目求的是小于等于r容量时的最大价值,则将f数组全部初始化为0,此时f[n]即为最大值
int f[maxn]; f[0] = 0;
int n, r; //输入物品的数量,还有书包的容量
cin >> n >> r;
cout << "请输入各物品的重量和价值" << endl;
for (int i = 1; i <= n; ++i) cin >> w[i] >> v[i];
//Dp主要过程
/*for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= r; ++j)
{
f[i][j] = f[i - 1][j];
if (j >= w[i]) f[i][j] = max(f[i][j], f[i - 1][j - w[i]] + v[i]);
}
}*/
//空间优化
for (int i = 1; i <= n; ++i)
{
for(int j=r;j>=w[i];j--)
{
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}
cout << "最大价值为:"<<f[r] << endl;
/*for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= r; j++) cout << f[i][j] << " ";
cout << endl;
}*/
//完全背包
//for (int i = 1; i <= n; ++i)
//{
// for (int j = w[i]; j <= r; j++) //顺序和上面的倒过来
// {
// f[j] = max(f[j], f[j - w[i]] + v[i]);
// }
//}
//for (int i = 1; i <= r; i++) cout << f[i] << " ";
cout << endl;
system("pause");
return 0;
}
/*
完全背包
for (int i = 1; i <= n; ++i)
{
for(int j=w[i];j<=r;j++) //顺序和上面的倒过来
{
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}
*/
动态规划解决01背包问题
最新推荐文章于 2023-11-13 17:15:00 发布