題目來自洛谷->p1757 通天之分組揹包
題目背景
直達通天路·小 a 歷險記第二篇
題目描述
自 01 揹包問世之後,小 a 對此深感興趣。一天,小 a 去遠遊,卻發現他的揹包不同於 01 揹包,他的物品大致可分為 k 組,每組中的物品相互衝突,現在,他想知道最大的利用價值是多少。
輸入格式
兩個數 m,n,表示一共有 n 件物品,總重量為 m。
接下來 n行,每行 3個數 a i,b i,c i
,表示物品的重量,利用價值,所屬組數。
輸出格式
乙個數,最大的利用價值。
輸入輸出樣例
輸入
45 3輸出 說明/提示10 10 1
10 5 1
50 400 2
1≤m,n≤1000。
思路
分組揹包與01揹包的區別就在於有分組的限制,同一組的物品最多只能選乙個。其他的跟01揹包大相徑庭。
輸入時記錄每個組中有多少物品(c[zu][0]++;),且記錄每個物品的下標(c[zu][c[zu][0]] = i;)。並且更新組號求得最大組號( k = max(k,zu))
for
(int i =
1;i <= n;i++
)
迴圈方面跟01揹包差不多,就是多個組迴圈。採用滾動陣列優化空間
for
(int i =
1;i <= k;i++
)//組遍歷
for(
int j = m;j >
0;j--
)//揹包重量逆序遍歷
for(
int z =
1;z <= c[i][0
];z++
)
直接上**
#include
const
int max =
1e3+1;
using
namespace std;
int m,n;
int w[max]
,q[max]
,c[max]
[max]
,zu,k;
int dp[max]
;int
main()
for(
int i =
1;i <= k;i++
)//組遍歷
for(
int j = m;j >
0;j--
)//揹包重量逆序遍歷
for(
int z =
1;z <= c[i][0
];z++
) cout << dp[m]
;return0;
}
P1757 通天之分組揹包
題目背景 直達通天路 小 a 歷險記第二篇 題目描述 自 01 揹包問世之後,小 a 對此深感興趣。一天,小 a 去遠遊,卻發現他的揹包不同於 01 揹包,他的物品大致可分為 k 組,每組中的物品相互衝突,現在,他想知道最大的利用價值是多少。輸入格式 兩個數 m,n,表示一共有 n 件物品,總重量為...
P1757 通天之分組揹包
b就是在01揹包的基礎上對每個物品新增了組數,就變成了分組揹包。考慮到01揹包的狀態轉移方程dp j max dp j dp j a i b i 分組揹包和它相同.那麼怎麼填這個表呢,在01揹包中,通過倆層for迴圈來實現,第一層for是控制第i到n個拿不拿,在分組揹包中,這個問題就變成了第i個到n...
洛谷 P1757 通天之分組揹包
直達通天路 小a歷險記第二篇 自01揹包問世之後,小a對此深感興趣。一天,小a去遠遊,卻發現他的揹包不同於01揹包,他的物品大致可分為k組,每組中的物品相互衝突,現在,他想知道最大的利用價值是多少。輸入格式 兩個數m,n,表示一共有n件物品,總重量為m 接下來n行,每行3個數ai,bi,ci,表示物...