題目描述:
辰辰是個很有潛能、天資聰穎的孩子,他的夢想是稱為世界上最偉大的醫師。
為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。
醫師把他帶到個到處都是草藥的山洞裡對他說:
「孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。
我會給你一段時間,在這段時間裡,你可以採到一些草藥。如果你是乙個聰明的孩子,你應該可以讓採到的草藥的總價值最大。」
如果你是辰辰,你能完成這個任務嗎?
輸入:
輸入的第一行有兩個整數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...