天天看點

動态規劃(01背包)--采藥題目描述輸入格式輸出格式樣例

題目描述

辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了一個難題。醫師把他帶到一個到處都是草藥的山洞裡對他說:“孩子,這個山洞裡有一些不同的草藥,采每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡,你可以采到一些草藥。如果你是一個聰明的孩子,你應該可以讓采到的草藥的總價值最大。” 如果你是辰辰,你能完成這個任務嗎?

輸入格式

第一行有兩個整數T(1 <= T <= 1000)和M(1 <= M <= 100),用一個空格隔開,T代表總共能夠用來采藥的時間,M代表山洞裡的草藥的數目。 接下來的M行每行包括兩個在1到100之間(包括1和100)的整數,分别表示采摘某株草藥的時間和這株草藥的價值。

輸出格式

第一行隻包含一個整數,表示在規定的時間内,可以采到的草藥的最大總價值。

樣例

樣例輸入
70 3
71 100
69 1
1 2
           
樣例輸出
3
           

題目類型

01背包模闆題。

注:正的是模闆題鴨,甚至直接把01背包的模闆搬過來都能過🙃!

解題過程

思路

這裡将采每株草藥的時間看成物品體積(也就是取每件物品的"代價"),草藥的價值看成物品的價值( 毫無違和感),而醫師給辰辰的時間就看成背包的容量。(因為采每株草藥的時間為物品體積,那總時間就是背包容量啦)

完整代碼
#include<bits/stdc++.h>
using namespace std;
int f[1005],w[105],c[105];
int main()
{
	int t,m;
	scanf("%d%d",&m,&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&w[i],&c[i]);
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=m;j>=w[i];j--)
		{
			if(f[j]<f[j-w[i]]+c[i])
			{
				f[j]=f[j-w[i]]+c[i];
			}
		}
	}
	printf("%d\n",f[m]);
	return 0;
}
//都說了是模闆題...
           

看到這裡你有可能會有問題:狀态轉移方程呢?初始化呢?本蒟蒻都說了是01背包模闆題,就懶得寫了

詳見這個網址:https://blog.csdn.net/chengheng0629/article/details/118163850?spm=1001.2014.3001.5501

The end