洛谷 P1048 [NOIP2005 普及组] 采药 精讲

题目传送门

这道题是一道动态规划的模版题。

正解前的探索

在来看这篇题解前,我相信你已经尽你所能,把自己能想到的解法都试了式,才过来的,但是我还是要说一说这道题其他算法为什么不能做。

1.贪心

我一看到这道题首先想到的是贪心做法,一种常见的想法是:算出每种草药的“性价比”,即 w i / t i w_i / t_i wi/ti (价值/时间),然后从大到小排序,优先考虑“性价比”高的草药,如果能采(时间足够)就采,不能采就不采,直到时间都用完了,退出。

举个例子:

1 3
1 7
1 5
1 1

1 1 1 种草药的性价比就是 7 / 1 7/1 7/1,即 7 7 7
2 2 2 种草药的性价比就是 5 / 1 5/1 5/1,即 5 5 5
3 3 3 种草药的性价比就是 1 / 1 1/1 1/1,即 1 1 1

把所有草药的价值从大到小排序,结果为7 5 1,所以可以采到草药的最大价值就是7。

这样贪心的代码是这样的:

#include<bits/stdc++.h>
using namespace std;

// 使用结构体以方便后面排序
struct node{
   
   
	int t,w;
	double bi;
}nd[110];

// 结构体排序函数
bool cmp(node x,node y){
   
   
	if(x.bi==y.bi){
   
   
		return x.t<y.t;
	}
	return x.bi>y.bi;
}

int main(){
   
   
	int t,m;
	cin>>t>>m;
	for(int i=1;i<=m;i++){
   
   
		scanf("%d%d",&nd[i].t,&nd[i].w);
		// 计算“性价比”
		nd[i].bi=1.0*nd[i].w/nd[i].t; 
	}
	// 使用sort进行结构体排序
	sort
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值