Vijos P1412 多人揹包

2021-07-22 17:16:18 字數 1824 閱讀 7422

p1412多人揹包

accepted

標籤:[顯示標籤]

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

感謝dd_engi

多人揹包
也就是求揹包的第k優解
如果是求最優解dp[i][j],那麼只需要求max(dp[i - 1][j],dp[i - 1][j - w[i]] + p[i])
那麼求k優解dp[i][j][1~k],那麼只需要求dp[i - 1][j]的前k優解(有序)和dp[i - 1][j - w[i]] + p[i] 的前k優解(有序)
那麼兩個陣列歸併到dp[i][j][1~k]中,取前k優解即可。
那麼dp[i]只與dp[i - 1]有關,所以可以少開一維空間
膜拜大牛部落格
**:

/**多人揹包

link=

**/#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define maxn (4000 + 20) #define inf 0x3f3f3f3f #define pi acos(-1.0) using namespace std; typedef long long int lli; int list1[maxn]; int list2[maxn]; int dp[5500][55]; int main() while(o <= k) } } int ans = 0; for(int i = 1; i <= k; i ++) printf("%d\n",ans); return 0; }

vijos p1412 多人揹包

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 看來,合理的揹包安排方案是這樣的 每個人揹包裡裝的物品的總體積恰等於包的容量。每個包裡的每種物品最多只有一件,但兩個不同的...