time limit:1000ms
memory limit:65536k有n件物品和乙個容量為v的揹包。第i件物品的費用是c[i],價值是w[i]。這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。
第一行:三個整數,v(揹包容量,v<=200),n(物品數量,n<=30)和t(最大組號,t<=10);
第2…n+1行:每行三個整數wi,ci,p,表示每個物品的重量、價值、所屬組號。
僅一行,乙個數,表示最大總價值。
10 6 3
2 1 1
3 3 1
4 8 2
6 9 2
2 8 3
3 9 3
每組物品有若干種策略:是選擇本組的某一件,還是一件都不選。
設f[i][j]表示前i組物品花費空間j能取得的最大權值。
f[i][j]=max(f[i-1][j],f[i-1][j-w[k]]+c[k])(物品k屬於組i)。
可以將二維壓縮成一維
f[j]=max(f[j],f[j-w[k]]+c[k]);
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
long
long v,n,t,f[
1010][
1010
],head[
1010];
struct jgt
;jgt a[
1010];
bool
cmp(jgt t1,jgt t2)
void
input()
}return;}
voiddp(
)if(a[k]
.w<=j&&a[k]
.p!=a[k+1]
.p) f[i]
[j]=
max(f[i]
[j],f[i-1]
[j-a[k]
.w]+a[k]
.c);}}
}return;}
intmain()
6666 分組揹包
問題描述 乙個旅行者有乙個最多能裝v公斤的揹包,現在有n件物品,它們的重量分別是w1,w2,wn,它們的價值分別是c1,c2,cn。這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。輸入格式 第1行 三個整數,v 揹...
分組揹包 Acwing 9 分組揹包問題
題目鏈結 有 n 組物品和乙個容量是 v 的揹包。每組物品有若干個,同一組內的物品最多只能選乙個。每件物品的體積是 vij,價值是 wij,其中 i 是組號,j 是組內編號。求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行有兩個整數 n,v,用空格隔...
揹包九講 6 分組揹包
問題引入 有 n nn 組物品和乙個容量是 v vv 的揹包 每組物品有若干個,同一組內的物品最多只能選乙個 每件物品的體積是 vi,jv vi,j 價值是 wi,jw wi,j 其中 i ii 是組號,j jj 是組內編號 求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大,輸出最...