JZOJ4916 完全揹包問題

2021-07-25 07:32:04 字數 1346 閱讀 3653

給定

n 種物品,每種物品有無限個,體積是vi

。 現在有

m 個詢問,每個詢問給乙個揹包容量wi

,詢問是否能用給定的物品恰好裝滿wi

。 要求使用的vi

≥l的個數不超過

c 個。

data constraint n≤

50,m≤

100000,v

i≤10000

假如存在最小的vi

<

l (記為vm

in)且存在

x 可以在合法情況下被恰好裝滿,那麼x+

vmin

,x+2

∗vmi

n,..

.,x+

k∗vm

in顯然都合法。

所以我們的想法就比較直觀了,只需要維護wi

%vmi

n 是否合法即可。 設f

i,j 表示已經用了

i 個大件物品,最小的x滿足

x%vm

in=j

。 列舉這一次選擇vk

來填充,那麼fi

,j→f

i+(v

k≥l)

,(j+

vk)%

vmin

,因為可能轉移到之前的狀態,所以這裡需要spfa來轉移。

最後記ans

j=mini≤c

i=0f

i,j ,對於乙個詢問wi

如果an

swi%

vmin

≤wi 那麼wi

就是有解的,否則無解。

#include

#include

#include

#include

#include

using

namespace

std ;

#define n 50 + 10

#define m 10000 + 10

typedef

long

long ll ;

bool vis[m] ;

ll f[n][m] , ans[m] ;

int a[n] , d[200*m] ;

int n , m , l , c , num ;

void spfa( ll *g ) }}

vis[now] = 0 ;

}}int main() }}

for (int i = 0 ; i < a[1] ; i ++ )

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

return

0 ;}

以上.

揹包問題(完全揹包)

1.矩陣鏈乘法 2.投資組合問題 3.完全揹包問題 4.01揹包問題 5.最長公共子串行 乙個揹包,可以放入n種物品,物品j的重量和價值分別為,如果揹包的最大重量限制是b,怎麼樣選擇放入揹包的物品以使得揹包的總價值最大?組合優化問題,設表示裝入揹包的第j個物品的數量,解可以表示為。那麼目標函式和約束...

完全揹包問題

這個是從ppt上弄過來的。完全揹包問題 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。放入第i種物品的耗費的空間是ci,得到的價值是wi。求解 將哪些物品裝入揹包,可使這些物品的耗費的空間總和不超過揹包容量,且價值總和最大 基本思路 這個問題非常類似於01揹包問題,所不同的是每種物品有無限...

完全揹包問題

設有n種物品,每種物品有乙個重量及乙個價值。但每種物品的數量是無限的,同時有乙個揹包,最大載重量為m,今從n種物品中選取若干件 用乙個物品可以多次選取 使其重量的和小於等於m,而價值的和為最大。輸入有多組資料,對於每組輸入資料第1行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第2...