记忆化搜索(递归)
#include<iostream>
using namespace std;
const int N = 1e3 + 10;
int a[N], arr[N][N], b[N];
int n;
int m = 0;
int dfs(int i, int lv)//arr—储存已经遍历过的情况
{
if (arr[i][lv] != -1)return arr[i][lv];
if (i == n)return 0;
int dfs1 = 0, dfs2 = 0;
if (lv >= a[i])
dfs1 = dfs(i + 1, lv - a[i]) + b[i];
dfs2=dfs(i + 1, lv);
return arr[i][lv] = max(dfs1, dfs2);
}
int main()
{
memset(arr, -1, sizeof(arr));
int v; cin >> n>>v;//n表示物品数量,v表示背包大小。
for (int i = 0; i < n; i++)cin >> a[i] >> b[i];//a—表示所占空间大小,b—表示价值
cout << dfs(0,v) << endl;
return 0;
}
递推
#include<iostream>
using namespace std;
const int N = 1e3 + 10;
int a[N], b[N], arr[N][N];
int main()
{
int n, v;
cin >> n >> v;
for (int i = 0; i < n; i++)cin >> a[i] >> b[i];
for (int i = 1; i <= n; i++)//arr[i][j]表示背包体积为j时前i个物品,装下的最大价值。
{
for (int j = 1; j <= v; j++)
{
if(j<a[i-1])
arr[i][j]=arr[i-1][j];
else
arr[i][j]=max(arr[i-1][j],arr[i-1][j-a[i-1]]+b[i-1]);
}
}
cout << arr[n][v] << endl;
return 0;
}