HRBUST 1558 小揹包(處處挖坑)

2021-09-25 18:47:11 字數 1485 閱讀 8345

題目:

有乙個容量為m(1<=m<=4000000)的揹包,有n(1<=n<=16)個物品,每個物品有體積v(1<=v<=2012)和價值w(0<=2012),現在要你選擇一些物品,使得揹包所裝物品的總價值最大。

input

有多組測試資料,但是不會超過10組。

對於每組測試資料,第一行是兩個整數m和n,表示揹包容量的和物品個數。接下來有n行,每行有兩個整數,表示乙個物品的體積和價值。

輸入到檔案結束。

output

對於每組測試資料,輸出一行,包含乙個整數,為揹包能裝下物品的最大價值。

sample input

10 3

6 95 5

5 53 2

1 22 1

sample output103

題目理解:

簡單的01揹包問題,按照動態規劃的思路,首先定義兩個變數n,s,分別存放物品個數和總的揹包可容納體積,另外定義兩個陣列,分別儲存各個物品的體積和價值,另外定義乙個dp陣列,可存放dp動態表(很美的~可在需要的時候列印出來,方便理解),最後輸出dp[n][s]。但這裡要特別注意的坑是,如果你按照題目所給的揹包最大體積-4000000來申請空間,那麼抱歉,後面無論你怎麼嘗試都會告訴你『memory limit exceeded』的字樣,也就是空間申請的太大了,我第一遍寫的時候就按照題目所給的限制申請陣列,所用空間為266088kb,而題目上給的僅僅是10240 kb,這差了相當於26倍,所以,這裡需要對空間進行優化。仔細一瞅,題目上告訴我們每個物品最大為2012體積單位,而最多只有16個物體,所以你只需要申請16*2012的空間就可以了,這樣差不多34000就足夠了,縮小了100多倍。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using namespace std;

int n,s;

int dp[17]

[33000];

int w[17]

=;int v[17]

=;void

findmax()

}}intmain()

if(sum1///注意自己輸入的是m,即使合在一起的體積沒那麼大,容積還是會在遍歷時用到m的數值,而發生陣列越界,因此注意

findmax()

; cout<[s]<}return0;

}

Hrbust 1333 GG的關心 01揹包

電腦買回來後,mm一直用它專心的搞acm,看著mm專注的樣子,gg也是非常開心,但害怕mm勞累過度影響身體,於是gg經常到超市給mm買一些營養品來補充身體能量。gg到超市購物從來都是刷卡的,可是這種卡很詭異,當用它在超市購物的時候,刷卡機會先判斷卡上的餘額是否低於5元錢。如果低於5元錢則無法購買任何...

背個小揹包

找區域性關係 首先說下動態規劃,動態規劃這東西就和遞迴一樣,只能找區域性關係,若想全部列出來,是很難的,比如漢諾塔。你可以說先把除最後一層的其他所有層都移動到2,再把最後一層移動到3,最後再把其餘的從2移動到3,這是乙個直觀的關係,但是想列舉出來是很難的,也許當層數n 3時還可以模擬下,再大一些就不...

HRBUST 1541 集合劃分 01揹包

description 對於從1到n 1 n 39 的連續整數集合,能劃分成兩個子集合,且保證每個集合的數字和是相等的。舉個例子,如果n 3,對於能劃分成兩個子集合,每個子集合的所有數字和是相等的 和 這是唯一一種分法 交換集合位置被認為是同一種劃分方案,因此不會增加劃分方案總數 如果n 7,有四種...