vijos p1412 多人揹包

2022-08-17 10:33:12 字數 1371 閱讀 6781

dd 和好朋友們要去爬山啦!他們一共有 k 個人,每個人都會背乙個包。這些包的容量是相同的,都是 v。可以裝進揹包裡的一共有 n 種物品,每種物品都有給定的體積和價值。

在 dd 看來,合理的揹包安排方案是這樣的:

每個人揹包裡裝的物品的總體積恰等於包的容量。 

每個包裡的每種物品最多只有一件,但兩個不同的包中可以存在相同的物品。 

任意兩個人,他們包裡的物品清單不能完全相同。 

在滿足以上要求的前提下,所有包裡的所有物品的總價值最大是多少呢?

第一行有三個整數:k、v、n( 1 <= k <= 50, 0 <= v <= 5000,1 <= n <= 200 )。

第二行開始的 n 行,每行有兩個整數,分別代表這件物品的體積和價值。

只需輸出乙個整數,即在滿足以上要求的前提下所有物品的總價值的最大值。

2 10 5

3 12

7 20

2 45 6

1 1

57

各個測試點1s

先看資料範圍,演算法時間複雜度應該是o(kvn)

考慮dp,此題為01揹包裝滿,唯一不同的是等於揹包重量所選的物品不能和另乙個揹包重複

考慮f[j][k],表示j重量的第k優的結果

於是f[j]可以從f[j]和f[j-w[i]]推來,通過比較更新出前k優的值

最後ans依次加,即為重量為v的前k優的各個價值和

1 #include2

using

namespace

std;

3const

int maxk=55;4

const

int maxv=5005;5

const

int maxn=205;6

intf[maxv][maxk];

7int

t[maxv];

8int

v[maxn],w[maxn];

9int

k,m,n;

10void solve(int a,int b,int

c)11

20for(int i=1;i<=k;i++)

21 a[i]=t[i];22}

23int

main()

2437

long

long ans=0;38

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

39 ans+=f[m][i];

40 printf("

%i64d

",ans);

41return0;

42 }

Vijos P1412 多人揹包

p1412多人揹包 accepted 標籤 顯示標籤 dd 和好朋友們要去爬山啦!他們一共有 k 個人,每個人都會背乙個包。這些包的容量是相同的,都是 v。可以裝進揹包裡的一共有 n 種物品,每種物品都有給定的體積和價值。在 dd 看來,合理的揹包安排方案是這樣的 每個人揹包裡裝的物品的總體積恰等於...

多人揹包問題

爆了。而且是這種半年前刷過的題目。演算法是合併兩個有序的序列,其他的方程之類與單人揹包其實差不多。code include include include include define swap a,b,t define max a,b define min a,b define maxk 55 d...

題目 多人揹包

dd 和好朋友們要去爬山啦!他們一共有 k 個人,每個人都會背乙個包。這些包的容量是相同的,都是 v。可以裝進揹包裡的一共有 n 種物品,每種物品都有給定的體積和價值。在 dd 看來,合理的揹包安排方案是這樣的 每個人揹包裡裝的物品的總體積恰等於包的容量。每個包裡的每種物品最多只有一件,但兩個不同的...