HGOI 物品選取

2022-05-26 20:48:08 字數 1555 閱讀 2910

小x確信所有問題都有個多項式時間演算法,為了證明,他決定自己去當一次旅行商,在上路之前,小x需要挑選一些在路上使用的物品,但他只有乙個能裝體積為\(m\)的揹包。顯然,揹包問題對小x來說過於簡單了,所以他希望你來幫他解決這個問題。

小x可以選擇的物品有\(n\)樣,一共分為甲乙丙三類:

1甲類物品的價值隨著你分配給他的揹包體積變化,它的價值與分配給它的體積滿足函式關係式,\(v(x) = a*x^2-bx\),\(a\),\(b\)是每個甲類物品的兩個引數。注意每個甲類物品最多隻能夠用一次。

2乙類物品的價值\(a\)和體積\(b\)都是固定的,但是每個乙類物品都有個引數\(c\),表示這個物品可供選擇的個數。

3丙類物品的價值\(a\)和體積\(b\)也是固定的,但是每個丙類物品可供選擇的個數都是無限多個。

你最終的任務是確定小x的揹包最多能裝有多大的價值上路。

第一行兩個整數\(n\),\(m\),表示揹包物品的個數和揹包的體積;

接下來\(n\)行,每行描述乙個物品的資訊。第乙個整數x,表示物品的種類:

若\(x\)為1表示甲類物品,接下來兩個整數\(a\), \(b\),為\(a\)類物品的兩個引數;

若\(x\)為2表示乙類物品,接下來三個整數\(a\),\(b\),\(c\)。\(a\)表示物品的價值,\(b\)表示它的體積,\(c\)表示它的個數;

若\(x\)為3表示丙類物品,接下來兩個整數\(a\),\(b\)。\(a\)表示它的價值,\(b\)表示它的體積。

輸出檔案僅一行為乙個整數,表示小x的揹包能裝的最大價值。

4 10

2 1 2 1

1 1 2

3 5 2

2 200 2 3

610
對於\(50\%\)的資料,只有乙和丙兩類物品;

對於\(70\%\)的資料,\(1<=n<=100\), \(1<=m<=500\),\(0<=a,b,c<=200\);

對於\(100\%\)的資料,\(1<=n<=100\), \(1<=m<=2000\),\(0<=a,b,c<=200\);

1s256m

remove!!!

題目都說這是乙個揹包問題了,當然要順從以下出題者的意願了。

乙類物品和丙類物品就是簡單的有限揹包和無限揹包了,正常打就好了。

沒學過揹包問題的請自行解決。

至於甲類物品,題目說每個甲類物品最多隻能夠用一次,那麼就有點像01揹包了,只不過甲類物品的重量和價值是不固定的。

所以正常揹包,在裡面再列舉一下甲類物品的重量就好了。

上**:

#includeusing namespace std;

int n,m;

int a,b,c,x;

int dp[2009];

int ans;

int main()else if(x==2)

}else if(x==3)

} for(int j=1;j<=m;j++)

ans=max(ans,dp[j]);

printf("%d",ans);

return 0;

}

複賽模擬試題 物品選取

問題描述 小沐同學確信所有問題都有個多項式時間演算法,為了證明,他決定自己去當一次旅行商,在上路之前,小 x 需要挑選一些在路上使用的物品,但他只有乙個 能裝體積為 m 的揹包。顯然,揹包問題對小沐來說過於簡單了,所以他希望你來幫他解決這個問題。小沐可以選擇的物品有 n樣,一共分為甲乙丙三類 1 甲...

codevs5226 物品選取

問題描述 小沐同學確信所有問題都有個多項式時間演算法,為了證明,他決定自己去當一次旅行商,在上路之前,小 x 需要挑選一些在路上使用的物品,但他只有乙個能裝體積為 m 的揹包。顯然,揹包問題對小沐來說過於簡單了,所以他希望你來幫他解決這個問題。小沐可以選擇的物品有 n樣,一共分為甲乙丙三類 1 甲類...

HGOI20181031 模擬題解

sol 第一題就dp?然後寫了o n 2 dp再 考慮優化!盡量部分分帶上!我寫了正確的dp然後優化錯了,具體的dp方法是考慮到對於右側到左側他是沒有後效性的 所以定義f i 為i及以後最大的代價和,對於合法的j,轉移f i max,j需要滿足a i x i i 由於給出的a i 遞增然後我只要往i...