描述
乙個旅行者有乙個最多能裝v公斤的揹包,現在有n件物品,它們的重量分別是w1,w2,…,wn,它們的價值分別為c1,c2,…,cn。這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。輸入
第一行:三個整數,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
20思路:
因為對每一組的物品只有兩種操作,選乙個或不選,所以可以把每一組當成01揹包的一件物品來做
二維:
#include
using namespace std;
struct node
;int dp[11]
[201];
vectorgup[11]
;int
main()
);}for
(int i=
1;i<=t;i++)}
if(dp[i]
[v]>re)re=dp[i]
[v];
}printf
("%d\n"
,re)
;}
二維需要注意的是判斷加入當前物品是否大於上一組值時還要判斷是否大於本組未選時的值;
最重要的是(個人認為最容易忽略的)可能存在最大組為空的情況這樣輸出時dp[t][v]可能沒有更新到,因為沒有考慮到這個wa到懷疑人生,直到加了這句『if(dp[i][v]>re)re=dp[i][v];』才過,感覺再保險點(1~t組之間出現空組)如果遇到空組就把dp[i-1]的值給dp[i]
一維:感覺不僅是空間上的優化,要考慮特殊原因也比二維少(個人認為)
唯一要注意的是一層迴圈為組別,二層迴圈為揹包容量,三層才是每組的物品,只有這樣才能保證每一組最多選乙個;
**:
#include
#include
using namespace std;
struct node
;int
main()
,n,m,t,w,val,g;
vectorgroup[11]
;scanf
("%d%d%d"
,&m,
&n,&t)
;for
(int i=
0;i;}
for(
int i=
1;i<=t;i++)}
printf
("%d\n"
,dp[m]);
return0;
}
剛學揹包,還有很多地方不是特別懂,**可能也有瑕疵,歡迎各位大佬指正^ _ ^; 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 是組內編號 求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,且總價值最大,輸出最...