HDU2191 多重揹包

2021-09-10 15:22:43 字數 941 閱讀 2505

1.題目鏈結。中文題目就不再說題意了。首先我們知道這個題目的意思就是給你n中物品,每種物品有重量,價值,數量這三個屬性。然後給定乙個數值的錢,問這些錢最可以買多少東西。其實和揹包的思想是一樣的,就是容量為v的揹包最多可以裝多少東西。

2.分析:這和我們之前說到的01揹包和完全揹包都是不一樣的,因為01揹包中物品只有乙個,所以就是拿與不拿的問題,完全揹包中物品的數量是無限的,所以就是拿多少個的問題,然而在這裡似乎綜合了這兩個問題,物品的數量是任意的(注意:這裡的任意指的是乙個有限的值,一定不是乙個無限的值,否則問題的求解會發生變化)。這種問題我們叫做多重揹包。

3.關於多重揹包的解法有很多種,我們這裡就先看乙個dp寫法。dp的寫法也是有好幾種寫法,我們就寫個最簡單的(不是因為我懶,是因為難的不會)。我們知道,在完全揹包裡,我們沒有列舉物品的數量,而是通過改變迴圈的方向解決了轉移的問題。但是這裡我們就不能這樣做了,顯然,最直接的寫法就是列舉這些屬性。有三個屬性就分三次列舉:首先第一層列舉物品的種類(其實仔細的想一下,在01揹包中我們的第一層的列舉也是在列舉種類,因為每種物品只有乙個)那麼顯然,第二層我們就應該列舉每一種物品的數量了,第三層當然就是價值了。注意這裡就應該是倒著迴圈!知道了這些,轉移的方程就很好寫了,幾乎和完全揹包的沒有區別。直接給出**吧。

#include#include#includeusing namespace std;

int n, m;

const int n = 300;

int v[n], w[n], num[n];

int dp[n];

#pragma warning(disable:4996)

int main()

memset(dp, 0, sizeof(dp));

for (int i = 0; i < m; i++)

}} printf("%d\n", dp[n]);

}}

HDU 2191 多重揹包

problem description 急!災區的食物依然短缺!為了挽救災區同胞的生命,心繫災區同胞的你準備自己採購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?後記 人生是乙個充滿了...

HDU 2191 多重揹包

題目大意 有m種公尺,給出每種公尺花費,重量和數量,問n元能獲得的最大重量是多少 題目思路 對於每個包,如果數量 花費 n,那麼很明顯直接多重揹包即可,否則就需要用到二進位制拆分法。由於0 2 k 1內所有的數字都可以通過2 0 2 1 2 2.2 k 1 中若干個數字得到。那麼可以把數量為c的物品...

HDU 2191 多重揹包

急!災區的食物依然短缺!為了挽救災區同胞的生命,心繫災區同胞的你準備自己採購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?後記 人生是乙個充滿了變數的生命過程,天災 人禍 病痛是我們生...