【模板题】动态规划 NOI :1775:采药 —— 01背包问题

题目:点击打开链接

题目大意:T时间内能采到的草药的最大总价值,M:草药的数目。每个草药有摘采时间t,价值val

注意:
1、结构体和重载函数的编写方法!
2、状态转移不要忘了else
3、sort函数,到a.end()

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int dp[101][1001]={0};
struct P//结构体的编写方法
{
	int t,val;
	bool operator < (const P &a)const//重载函数的比较方法!
	{
		if (val==a.val)
			return t<a.t;
		else
			return val<a.val;
	}
};
P a[101];
int main()
{
	int i,j,T,M;
	cin>>T;cin>>M;
	for (i=1;i<=M;i++)
		cin>>a[i].t>>a[i].val;
	sort(a+1,a+M+1);//注意后面排序要加1
	for (i=1;i<=M;i++)
		for (j=1;j<=T;j++)
			if (a[i].t<=j)//若当前物品时间<总时间
				dp[i][j]=max( dp[i-1][j],dp[i-1][j-a[i].t]+a[i].val );
			else
				dp[i][j]=dp[i-1][j];//注意否则不要往,否则一定不拿
	cout<<dp[M][T];
	return 0;
}

猜你喜欢

转载自blog.csdn.net/always_ease/article/details/80525175