hdu 1712 分組揹包入門

2022-06-02 12:57:10 字數 1152 閱讀 2971

問題

有n件物品和乙個容量為v的揹包。第i件物品的費用是c[i],價值是w[i]。這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

這個問題變成了每組物品有若干種策略:是選擇本組的某一件,還是一件都不選。也就是說設f[k][v]表示前k組物品花費費用v能取得的最大權值,則有:

f[k][v]=max

使用一維陣列的偽**如下:

for所有的組k

forv=v..0

for所有的i屬於組k

f[v]=max

注意這裡的三層迴圈的順序,甚至在本文的第乙個beta版中我自己都寫錯了。「forv=v..0」這一層迴圈必須在「for所有的i屬於組k」之外。這樣才能保證每一組內的物品最多只有乙個會被新增到揹包中。

另外,顯然可以對每組內的物品應用p02

(完全揹包問題)中「乙個簡單有效的優化」。

分組的揹包問題將彼此互斥的若干物品稱為乙個組,這建立了乙個很好的模型。不少揹包問題的變形都可以轉化為分組的揹包問題(例如p07

(有依賴的揹包問題)),由分組的揹包問題進一步可定義「泛化物品」的概念,十分有利於解題。

1712

題目大意:

乙個學生用m天的時間複習n門課程,每門課程花費不同的天數,有不同的收穫。問如何安排這m天,使得收穫最大。

解題思路:

分組揹包即物品分為多組,每一組的各個物品最多只能取乙個。解題方法即在迴圈最裡面再巢狀乙個迴圈,查詢每組中價值最大的物品。

**部分:

1 #include 2 #include 3 #include 

4 #include 5 #include 6 #include 7

using

namespace

std;

8#define n 110

9int

a[n][n];

10int

dp[n];

11int

main()

1227

return0;

28 }

hdu 1712 分組揹包

分組的揹包問題 問題 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。演算法 這個問題變成了每組物品有若干種策略 是選擇本組的某一件,還是一件...

hdu 1712 分組揹包)

思路 這是一道簡單的分組揹包,因為每種課可以有多種選擇 花幾天時間在該課上。一旦作出選擇,就不能再選該課,就相當於有多組物品,每組內的物品互相衝突,最多只能選一件。偽碼 for 所有的組k for v v.0 for 所有的i屬於組k f v max 1 include2 const int max...

HDU 1712(分組揹包)

這個寫的不錯 發現問題的起因是hdu 1712,乙個赤裸的分組揹包。所以有必要說一下這個題目。題意 乙個學生用m天的時間複習n門課程,每門課程花費不同的天數,有不同的收穫。問如何安排這m天,使得收穫最大。思路 可以將每一門課看成乙個分組,每門課不同天數的選擇看成是分組的物品 顯然只能有乙個選擇 物品...