描述
乙個旅行者有乙個最多能裝 m 公斤的揹包,現在有 n 件物品,它們的重量分別是w1,w2,…,wn,它們的價值分別為c1,c2,…,cn,求旅行者能獲得最大總價值。
輸入第一行:兩個整數,m(揹包容量,m≤200)和n(物品數量,n≤30);
第2…n+1行:每行二個整數wi,ci,表示每個物品的重量和價值。
輸出僅一行,乙個數,表示最大總價值。
輸入樣例 1
10 4
2 13 3
4 57 9
輸出樣例 1
12**
一本通
1.簡單01揹包:
2.01揹包+思維。poj 3628 bookshelf 2(dp:01揹包)
要考慮到一共價值是s,那麼選擇的s-h的揹包中價值最大maxx,然後用s-h-maxx就是多出h的那一小部分最小,因為總和是一定的所以一定可以裝滿h+多出的一小部分。
3.hdu 2546飯卡(dp:01揹包)
思路就是讓總容量-5(因為餘額大於5才能買乙個最大的)求個揹包,再減掉最大的物品。
4.robberies(01揹包+概率)
把銀行的錢當做揹包,把概率當做價值,總容量為所有銀行的總錢數,求不超過被抓
概率的情況下,最大的揹包容量是多少
dp[j] = max(dp[j],dp[j-bag[i].v]*(1-bag[i].p))(dp[j]表示在被搶概率j之下能搶的錢);
5.沒看懂。。。貪心+揹包。
***6. 01揹包+按照揹包的順序輸出路徑。
uva 624 cd(dp:01揹包)
可以這麼想,每乙個揹包都跟能容納他的容量有聯絡,用vis進行標記。
然後每乙個東西都判斷一下跟當前選的東西有無影響。
7.揹包+思維
uva 562 dividing coins(dp:01揹包)
就是怎麼分兩堆硬幣,使得兩堆差值最小。以sum/2為揹包容量得解。
8.思維poj3211(washing clothes + 0/1揹包)
sum/2的思想:
9.hdu 1203- i need a offer!(概率)(反著想)
這道題讓求得到至少得到乙份offer的最大概率,直接對這個問題進行處理有些麻煩,那麼我們可以通過算出乙份offer也拿不到的最小概率,通過概率和是1我們就可以得到要求的答案了,跟搶劫那一題比較像,概率是相乘而不是相加
***10.poj 1837 balance(感覺這道題跟揹包沒關係。。。)(好題!)
11.好題!二維揹包
hdu 3496 watch the movie
題意:有商品個數限制的揹包問題。
在普通的揹包問題上再開一維表示已經買了的商品的個數。dp[i][j][k]表示前i個物品,花費為j,已經買了k個商品的最大價值。
轉移方程為:
#includeusing namespace std;
int w[1000],v[1000],dp[100000];
int main()
for(int i=1;i<=n;i++)
} cout<
return 0;
}
01揹包 題解
略略 我們的狀態陣列f i j f i j f i j 指在揹包有j jj的容量,只有前i ii件物品時的最大價值 由於每種物品只有選與不選兩種情況 所以如果容量允許,那麼f i j f i j f i j 只有兩種選擇 選擇第i ii件物品,或不選 狀態轉移方程見 然鵝,我們可以使用一些奇妙的手段...
Dima and Salad 題解 01揹包變形
給你n個物品,每個物品有兩個值乙個為a,乙個為b 要你拿任意的物品使得 sum a sum b k 且max sum a 1 n 100 1 k 10 1 a i b i 100 乙個顯然易見的思路設 dp i j 為是否有 sum a i sum b j 然後最後複雜度為 o 1e10 顯然不行 ...
揹包 01揹包
01揹包 有n種物品與承重為m的揹包。每種物品只有一件,每個物品都有對應的重量weight i 與價值value i 求解如何裝包使得價值最大。dp i,v 表示前i個物體 包括第i個 面對容量為v的揹包的最大價值,c i 代表物體i的重量,w i 代表物體i的價值 如果第i個物體不放入揹包,則揹包...