每日一題(三十六) 0 1揹包

2021-09-11 20:03:50 字數 1502 閱讀 1165

題目描述:

辰辰是個很有潛能、天資聰穎的孩子,他的夢想是稱為世界上最偉大的醫師。

為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。

醫師把他帶到個到處都是草藥的山洞裡對他說:

「孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。

我會給你一段時間,在這段時間裡,你可以採到一些草藥。如果你是乙個聰明的孩子,你應該可以讓採到的草藥的總價值最大。」

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

輸入:

輸入的第一行有兩個整數t(1 <= t <= 1000)和m(1 <= m <= 100),t代表總共能夠用來採藥的時間,m代表山洞裡的草藥的數目。

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

輸出:

可能有多組測試資料,對於每組資料,

輸出只包括一行,這一行只包含乙個整數,表示在規定的時間內,可以採到的草藥的最大總價值。 

樣例輸入:

70 3

71 100

69 1

1 2樣例輸出:

3

/*

dp[i][j]表示總體積不超過j的情況下,前i個物品能夠達到的最大價值和

*/#include#define inf 0x7fffffff

int max(int a, int b)

struct e list[101];

int dp[101][1001];

int main()

for (int i = 0; i <= s; i++)

for (int i = 1; i <= n; i++)

for (int j = list[i].w - 1; j >= 0; j--)

} printf("%d\n", dp[n][s]);

} return 0;

}

優化:

/*

觀察狀態轉移特點,發現dp[i][j]的轉移僅僅1與dp[i-1][j]和dp[i-1][j-list.w]有關

即僅和二維陣列中本行的上一行有關。根據此特點,將原本的二維陣列優化為一維

*/#include#define inf 0x7fffffff

int max(int a, int b)

struct e list[101];

int dp[1001];

int main()

for (int i = 0; i <= s; i++)

for (int i = 1; i <= n; i++)

} printf("%d\n", dp[s]);

} return 0;

}

每日一題01

輸入 每組輸入資料共兩行。第一行為字串a 第二行為字串b 字串長度均小於100且只包含小寫字母 輸出 輸出乙個數字,表示把字串b插入字串a之後構成乙個回文串的方法數 思路 第一種方法 第一步 判斷回文串 將乙個字串使用charat 方法轉換為字元陣列,遍歷陣列,分別判斷陣列的第個是否等於陣列長度 1...

js每日一題01

如下,請給出執行結果並說明原因 let obj obj.push 1 obj.push 2 console.log obj 執行結果 題目解析 1 首先obj呼叫push方法,走的是陣列的push方法 即每次都在最後一項新增值 那麼問題來了,陣列的push方法到底是怎麼實現的呢?array.prot...

寒假每日一題題解 2 1 開心的金明(01揹包)

金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n元。於是,他把每件物品規定了乙個重要度,分為5...