P1757 通天之分組揹包(分組揹包問題)

2021-10-24 15:26:00 字數 1671 閱讀 5578

題目來自洛谷->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,表示物...