HDU 1712 分組揹包問題

2021-07-24 05:56:51 字數 1239 閱讀 3795

題目連線:

題意:有m天可以分給n個課程,課程得分和課程上的天數有關,問在m天以內最多一共可以得到多少分

乙個分組揹包的入門題,把乙個課程上不同的天數得到的分數看作是一組的,每組最多只能選乙個物品

每乙個物品的代價是上的天數,價值是這門課在這個天數上得到的分數

那麼這樣就是乙個分組揹包問題

二維dp陣列

列舉每乙個分組,順序列舉揹包容量,列舉分組物品,得到如下的公式

**:

#include 

#define sf scanf

#define pf printf

/** * 題意:給100門課程和每門課程上的天數和得到的分數,求最大分數

* 我們考慮分組揹包,將一門課程上不同的天數分到一組物品中

* * 那麼dp[i][j] 表示考慮第i組物品,消耗了j天的時候我們得到的最大分數

*/using

namespace

std;

const

int maxn = 100 + 5,inf = 2e9;

int a[maxn][maxn];

int dp[maxn][maxn];

int main()

memset(dp,0xbf,sizeof dp);

dp[0][0] = 0;

for(int i = 1;i <= n;++i)

for(int j = 0;j <= m;++j)

for(int k = 0;k <= j;++k)

int ans = 0;

for(int i = 0;i <= m;++i) ans = max(ans,dp[n][i]);

pf("%d\n",ans);}}

一維dp陣列

先列舉每乙個分組,逆序揹包容量,順序列舉分組物品,得到轉移公式如下:

**:

#include 

#define sf scanf

#define pf printf

using

namespace

std;

const

int maxn = 100 + 5;

int a[maxn][maxn];

int n,m;

int dp[maxn];

int main()}}

pf("%d\n",dp[m]);}}

hdu 1712 分組揹包問題

1y很開心。分組揹包就是在01揹包的基礎上分了多個組,每組只能取乙個。這樣在01揹包上再加一重迴圈就可以了。二維的狀態轉移方程 f k,v max 揹包九講的偽 如下 for k 1 to k for v v to 0 for item i in group k f v max 就是先進行每組的遍歷...

HDU 1712 分組揹包問題

物品分多組,每組中的每件都是衝突的,那麼,揹包問題變成,在某組中取乙個,使得價值達到最大,或者這組乙個都不取能使價值達到最大,在01揹包基礎上加乙個迴圈就可以,在減去體積的時候依次減去每組每乙個的體積,這裡的體積正好對應縱座標,所以不必再抽象成c i 了,價值w i 問題有n件物品和乙個容量為v的揹...

hdu 1712 分組揹包

分組的揹包問題 問題 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。演算法 這個問題變成了每組物品有若干種策略 是選擇本組的某一件,還是一件...