简单的背包——01背包(1)
题目来源:洛谷 P1048 [NOIP2005 普及组] 采药
共十个测试点
题解
AC代码
#include <bits/stdc++.h>
using namespace std;
// tim 表示第 i 个物品采摘所需时间;val 表示第 i 个物品的价值
int tim[105], val[105];
// dp 记忆化搜索
// dp[x][y] 表示还有 x 件物品可以选择,还剩 y 个时间可以使用
int dp[105][1005];
int t, m;
int main()
{
// 初始化
memset(dp, 0, sizeof(dp));
scanf("%d%d", &t, &m);
for (int i = 1; i <= m; ++i)
scanf("%d%d", &tim[i], &val[i]);
for (int i = 1; i <= m; ++i)
{
// 时间 t 从 1 到 最大值
for (int j = 1; j <= t; ++j)
{
// 当物品采摘所需时间大于 t 时:
if (tim[i] > j)
dp[i][j] = dp[i - 1][j];
// 当物品采摘所需时间小于等于 t 时:
else
// dp[i - 1][j] 表示不选择 i 物品
// dp[i - 1][j - tim[i]] + val[i] 表示选择 i 物品
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - tim[i]] + val[i]);
}
}
printf("%d", dp[m][t]);
return 0;
}