題目連線:
題意:有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 這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。演算法 這個問題變成了每組物品有若干種策略 是選擇本組的某一件,還是一件...