辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說:「孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡,你可以採到一些草藥。如果你是乙個聰明的孩子,你應該可以讓採到的草藥的總價值最大。」(
如果你是辰辰,你能完成這個任務嗎?
這題是乙個簡單基礎的01揹包問題,或者說是模板題,01揹包主**如下:
for(int i=1;i<=n;i++)
}
什麼意思呢?是這樣的:「將前i件物品放入容量為j的揹包中」這個子問題,若只考慮第i件物品的策略(放或不放),那麼就可以轉化為乙個只牽扯前i-1件物品的問題。如果不放第i件物品,那麼問題就轉化為「前i-1件物品放入容量為j的揹包中」,價值為f[i-1][j];如果放第i件物品,那麼問題就轉化為「前i-1件物品放入剩下的容量為j-w[i]的揹包中」,此時能獲得的最大價值就是f[i-1][j-c[i]](c[i]為價值)再加上通過放入第i件物品獲得的價值c[i]。
如果知道了這些,此題難度是不是大大下降?好了,直接粘**吧:
#include #include int f[1009][109];
int w[101],c[101];//陣列開在外面
using namespace std;
int main()
for(i=1;i<=m;i++)//狀態轉移方程
else
}} printf("%d",f[m][t]);
return 0;
}
洛谷 P1048 採藥
題目描述 辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡...
洛谷 P1048 採藥
題目描述 辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡...
洛谷 P1048 採藥
辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡,你可以採...