p1412多人揹包
accepted
標籤:[顯示標籤]
dd 和好朋友們要去爬山啦!他們一共有 k 個人,每個人都會背乙個包。這些包的容量是相同的,都是 v。可以裝進揹包裡的一共有 n 種物品,每種物品都有給定的體積和價值。
在 dd 看來,合理的揹包安排方案是這樣的:
每個人揹包裡裝的物品的總體積恰等於包的容量。
每個包裡的每種物品最多只有一件,但兩個不同的包中可以存在相同的物品。
任意兩個人,他們包裡的物品清單不能完全相同。
在滿足以上要求的前提下,所有包裡的所有物品的總價值最大是多少呢?
第一行有三個整數:k、v、n( 1 <= k <= 50, 0 <= v <= 5000,1 <= n <= 200 )。
第二行開始的 n 行,每行有兩個整數,分別代表這件物品的體積和價值。
只需輸出乙個整數,即在滿足以上要求的前提下所有物品的總價值的最大值。
2 10 53 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 看來,合理的揹包安排方案是這樣的 每個人揹包裡裝的物品的總體積恰等於包的容量。每個包裡的每種物品最多只有一件,但兩個不同的...