1. 程式人生 > >采藥(01背包)

采藥(01背包)

輸入格式 sof 一個空格 空間 return can 描述 size .com

-->測評傳送門

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

如果你是辰辰,你能完成這個任務嗎?
輸入格式
第一行有 2 個整數T(1≤T≤1000) 和 M(1≤M≤100) ,用一個空格隔開, TT代表總共能夠用來采藥的時間, MM代表山洞裏的草藥的數目。 接下來的 M 行每行包括兩個在 1 到 100之間(包括 1 和 100 )的整數,分別表示采摘某株草藥的時間和這株草藥的價值。


輸出格式
1 個整數,表示在規定的時間內可以采到的草藥的最大總價值。
樣例
樣例輸入

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

3


非常經典的DP 裸 題,01背包的新手入門

解析:  

  • 簡單來說,枚舉每個物品,能塞就塞,關鍵是要判斷用這麽多的空間是否可以更新最大價值

一看代碼就懂啦:

#include<stdio.h>
#include<algorithm>
using namespace std;
const int N=101,M=1001;
int w[N],val[N],f[M];
int main()
{
    int n,m;
    scanf("%d%d
",&m,&n); for(int i=1;i<=n;++i) scanf("%d%d",&w[i],&val[i]); for(int i=1;i<=n;++i) { for(int j=m;j>=w[i];--j) { f[j]=max(f[j-w[i]]+val[i],f[j]); } } printf("%d",f[m]); return 0; }

采藥(01背包)