Link
luogu P1048 [NOIP2005 普及组] 采药
ybtoj【背包问题课堂过关】【例题1】采药问题
题面//因为不知道侵不侵权所以就是题面是私密的,有账号的直接看转送门就可了
题目大意
有 n n n株草药,采第 i i i株草药要花费 w i w_i wi的时间,同时也会获得 v i v_i vi的价值,要求你在 t t t时间内采到的草药总值最大。
解题思路
01背包模板题
设
f
[
x
]
f[x]
f[x]为用时间
x
x
x可以摘到的总值最大的草药
f
[
x
]
=
m
a
x
(
f
[
x
]
,
f
[
x
−
w
[
i
]
]
+
v
[
i
]
)
f[x]=max(f[x],f[x-w[i]]+v[i])
f[x]=max(f[x],f[x−w[i]]+v[i])
Code
#include <iostream>
#include <cstdio>
using namespace std;
int t, n, w[110], v[110], f[1100];
int main() {
scanf("%d %d", &t, &n);
for(int i = 1; i <= n; i++)
scanf("%d %d", &w[i], &v[i]);
for(int i = 1; i <= n; i++)
for(int j = t; j >= w[i]; j--) //倒序去重
f[j] = max(f[j], f[j - w[i]] + v[i]);
printf("%d", f[t]);
}
该博客介绍了NOIP2005普及组的一道采药问题,这是一个典型的01背包问题。题目要求在限定时间内,通过选择不同价值和消耗时间的草药,使总价值最大化。解题思路是采用动态规划的01背包模板,通过双重循环更新dp数组,最终得到最大价值。代码中展示了具体的实现过程。

1954

被折叠的 条评论
为什么被折叠?



