動態規劃(揹包問題)

2021-10-08 22:53:26 字數 3355 閱讀 8767

雙十一就這樣轟轟烈烈的來了,對於乙個買東西只靠網購的資深宅男小灰灰來說,這的確是個令人興奮的事情。

而現在的小灰灰卻是痛並快樂著,因為本就乾癟的錢包實在擠不出多少money用來購物了,誰叫他把錢都用來買紙了呢…話說錢到用時方恨少,小灰灰處在深深的憂慮中,不知道怎樣才能用剩下的錢買到最有價值的東西,各位小夥伴你們能把他搞定這件事嗎

第一行乙個整數t表示有t組測試資料(t<=50)。

接下來的t組測試資料:

第一行包含兩個整數n和m,n表示小灰灰有多少錢,m表示有多少件物品(1<=m<=100)。

再二行包含m個整數,表示對應每個物品的**。

第三行包含m個整數,表示對應每個物品的價值。

0請幫助小灰灰使用僅有的錢購買物品,並使物品的總價值最大。輸出最大值。

410 5

2 3 7 7 3

4 3 5 6 4

10 8

5 6 4 2 3 7 1 8

5 3 5 3 5 7 5 7

20 7

10 15 4 5 6 8 5

15 14 9 2 2 6 7

10 3

7 4 5

16 7 10

case #1: 11

case #2: 18

case #3: 31

case #4: 17

#include

using

namespace std;

int dp[

300100];

intmain()

printf

("case #%d: %d\n"

,k,dp[n]);

}}return0;

}

fill函式

按照單元賦值,將乙個區間的元素都賦同乙個值

在標頭檔案< algorithm>裡面

fill函式可以賦值任何,而且使用方法特別簡便:

例如int陣列:fill(arr, arr + n, 要填入的內容);

#include

#include

using

namespace std;

intmain()

vector也可以:fill(v.begin(), v.end(), 要填入的內容);

#include

#include

#include

using

namespace std;

intmain()

;fill

(v.begin()

, v.

end(),

1);return0;

}

memset函式

按照位元組填充某字元

在標頭檔案< cstring>裡面

因為memset函式按照位元組填充,所以一般memset只能用來填充char型陣列,(因為只有char型佔乙個位元組)如果填充int型陣列,除了0和-1,其他的不能。因為只有00000000 = 0,-1同理,如果我們把每一位都填充「1」,會導致變成填充入「11111111」

#include

#include

using

namespace std;

intmain()

fill_n

引數包括 : 乙個迭代器,乙個計數器以及乙個值。該函式從迭代器指向的元素開始,將指定數量的元素設定為給定的值。

fill_n

(vec.begin,

10, val)

;

注意: 不能在沒有元素的空容器上呼叫fill_n函式,但是可以通過下面的方法改進。

為了保證演算法有足夠的元素儲存輸出資料,我們使用「插入迭代器」(insert iterator),插入迭代器是可以給基礎容器新增元素的迭代器。

使用 back_inserter 的程式需要包含標頭檔案#include,將上面的程式改寫成

#include

vector<

int> vec;

//定義乙個空容器

fill_n (

back_inserter

(vec)

,10 val)

;

給定n個物品,每個物品有乙個重量w和乙個價值v.你有乙個能裝m重量的揹包.問怎麼裝使得所裝價值最大.每個物品只有乙個

輸入的第一行包含兩個整數n, m,分別表示物品的個數和揹包能裝重量。

以後n行每行兩個數wi和vi,表示物品的重量和價值

輸出1行,包含乙個整數,表示最大價值。

3 52 3

3 54 7

#include

using

namespace std;

int a[

1001

],b[

1001

],dp[

1001];

intmain()

for(

int i=

1; i<=n; i++)}

cout<

}

北大網路實驗室經常有活動需要叫外買,但是每次叫外買的報銷經費的總額最大為c元,有n種菜可以點,經過長時間的點菜,網路實驗室對於每種菜i都有乙個量化的評價分數(表示這個菜可口程度),為vi,每種菜的**為pi, 問如何選擇各種菜,使得在報銷額度範圍內能使點到的菜的總評價分數最大。

注意:由於需要營養多樣化,每種菜只能點一次。

輸入的第一行有兩個整數c(1 <= c <= 1000)和n(1 <= n <= 100),c代表總共能夠報銷的額度,n>代表能點菜的數目。接下來的n行每行包括兩個在1到100之間(包括1和100)的的整數,分別表示菜的》**和菜的評價分數。

輸出只包括一行,這一行只包含乙個整數,表示在報銷額度範圍內,所點的菜得到的最大評價分數。

1 31 5

3 32 5

24 8

2 98 6

4 11 4

2 210 5

2 11 4530

#include

using

namespace std;

const

int maxn=

10005

;int a[maxn]

,pi[maxn]

,vi[maxn]

;int

main()

for(i=

1;i<=n;i++)}

cout << a[c]

<< endl;

}return0;

}

動態規劃 揹包問題

給定n個物品,重量是,價值是,包的容量 承重 是w 問,放入哪些物品能使得包內價值最大 1 需要將問題轉化為子問題,通過遞迴實現,且子問題必然與父問題存在關聯 2 定義v i,j 表示為,當item取自前i個items且揹包capacity j 時,揹包問題的最優解,也即最高的價值。3 從前i個it...

動態規劃 揹包問題

不廢話,直接上 動態規劃,揹包問題。輸入為 int n 物品的種類數。int n weight 各件物品的重量。int n value 各種物品的價值。int w 揹包最大的裝載重量。輸出 v n b 的值,最大的裝載價值。x n 各類物品的裝載數量。author huangyongye publi...

動態規劃 揹包問題

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