小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 102 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...