洛谷 P1048 採藥 (啟發式搜尋)

2022-10-10 23:09:13 字數 1115 閱讀 1406

題目描述

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

如果你是辰辰,你能完成這個任務嗎?

輸入格式

第一行有 22 個整數 tt(1 \le t \le 10001≤t≤1000)和 mm(1 \le m \le 1001≤m≤100),用乙個空格隔開,tt 代表總共能夠用來採藥的時間,mm 代表山洞裡的草藥的數目。

接下來的 mm 行每行包括兩個在 11 到 100100 之間(包括 11 和 100100)的整數,分別表示採摘某株草藥的時間和這株草藥的價值。

輸出格式

輸出在規定的時間內可以採到的草藥的最大總價值。

很明顯的揹包吧。這裡我們寫乙個啟發式搜尋,所謂的啟發式搜尋,就是我們在搜尋的時候用乙個估價函式去幫助和優化我們的決策。當我們選擇一樣草藥的時候沒什麼好說的,直接往下搜,當我們不選的時間,我們有估價函式來幫助我們判斷,接下來的價值是否大於我們目前的最優值,如果不大於那麼顯然我們沒有必要進行下一輪的搜尋。你可以理解為這個估價函式是幫助我們剪枝的乙個工具。

#include#include#include#include#includeusing namespace std;

typedef long long ll;

int n,m,ans;

const int maxn=105;

struct node e[maxn];

bool cmp (node a,node b)

int f(int t,int v)

else return (int ) (tot+v*e[i+t].val);

}return tot;

}void dfs (int t,int pass,int v)

sort (e+1,e+1+n,cmp);

dfs (1,m,0);

cout

}

洛谷 P1048 採藥

題目描述 辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡...

洛谷 P1048 採藥

題目描述 辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡...

洛谷p1048採藥

辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡,你可以採...