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
先看資料範圍,演算法時間複雜度應該是o(kvn)
考慮dp,此題為01揹包裝滿,唯一不同的是等於揹包重量所選的物品不能和另乙個揹包重複
考慮f[j][k],表示j重量的第k優的結果
於是f[j]可以從f[j]和f[j-w[i]]推來,通過比較更新出前k優的值
最後ans依次加,即為重量為v的前k優的各個價值和
1 #include2using
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 看來,合理的揹包安排方案是這樣的 每個人揹包裡裝的物品的總體積恰等於包的容量。每個包裡的每種物品最多只有一件,但兩個不同的...