这道题考察动态规划,我们可以用记忆化搜索的方法来解决此题。
首先,我们可以定义一个递归函数来求解最大值
int dfs(int x, int y)//x为第x个药,y为背包容量
{
int ans;
else if (x == 0)
ans = 0;
else if (b[x] > y)//当背包容量不够时,跳过此药
ans = dfs(x - 1, y);
else
{
ans = max(dfs(x - 1, y), dfs(x - 1, y - b[x]) + c[x]);//求选择此药或者不选此药的最优解
}
return ans;
}
但是我们会发现这种方法的时间复杂度是很大的,因此我们可以标记并赋值搜索过的情况,即为记忆化搜索
int dfs(int x, int y)
{
int ans;
if (a[x][y] != -1)
ans = a[x][y];
else if (x == 0)
ans = 0;
else if (b[x] > y)
ans = dfs(x - 1, y);
else
{
ans = max(dfs(x - 1, y), dfs(x - 1, y - b[x]) + c[x]);
a[x][y] = ans;
}
return ans;
}
下面附上代码
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int dfs(int x, int y);
int t, m;
int a[105][1005];
int b[1005];
int c[1005];
int main()
{
memset(a, -1, sizeof(a));//初始化数组
cin >> t >> m;
for (int i = 1; i <= m; i++)
cin >> b[i] >> c[i];
cout << dfs(m, t);
return 0;
}
int dfs(int x, int y)
{
int ans;
if (a[x][y] != -1)
ans = a[x][y];
else if (x == 0)
ans = 0;
else if (b[x] > y)
ans = dfs(x - 1, y);
else
{
ans = max(dfs(x - 1, y), dfs(x - 1, y - b[x]) + c[x]);
a[x][y] = ans;//进行标记
}
return ans;
}