这道题是一道动态规划的模版题。
正解前的探索
在来看这篇题解前,我相信你已经尽你所能,把自己能想到的解法都试了式,才过来的,但是我还是要说一说这道题其他算法为什么不能做。
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