【luogu P1048】【ybtoj】【背包问题课堂过关】【DP】【例题1】采药问题 &【NOIP2005 普及组】采药

该博客介绍了NOIP2005普及组的一道采药问题,这是一个典型的01背包问题。题目要求在限定时间内,通过选择不同价值和消耗时间的草药,使总价值最大化。解题思路是采用动态规划的01背包模板,通过双重循环更新dp数组,最终得到最大价值。代码中展示了具体的实现过程。

【例题1】采药问题 & [NOIP2005 普及组] 采药


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[xw[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]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值