hdu3033 分組揹包變形

2021-06-22 05:36:34 字數 1192 閱讀 9767

題意:n個物品,k個組,每個物品只能屬於乙個組,求至少每個組選乙個物品實現的最大價值

這是我的第一道分組揹包,這個和揹包九講裡面的那個典型例子不同,想了好久,都感覺沒有辦法確定每個組至少選乙個

所以看了題解,我用dp[i][j] 表示前i組物品,放在容量為j的揹包裡面實現的最大價值,這裡我感覺到了要求恰好裝滿i組物品,求最大值的二維費用揹包,

然後就寫出了**,狀態轉移方程dp[i][j] = max(dp[i][j], dp[i][j - s[i][k].cost] + s[i][k].value, dp[i][j - s[i-1][k].cost] + s[i][k].value)//其中s[i][j] 表示第i組的第j個物品,也就是

存的是輸入資訊。

這裡還要囉嗦一下,初始化問題,以前我們做過,恰好裝滿求最大值,初始化dp[0] = 0,dp[1------]初始化為-oo,所以這裡dp[0][i] = 0 ,dp[1----][i]初始化為-oo

**如下:

#include#include#include#include#include#include#include#include#include#include#include#include#define inf 0x7fffffff

#define eps 1e-9

#define pi acos(-1.0)

#define p system("pause")

using namespace std;

struct node

;vectors[15];

int dp[15][10005];//dp[i][j]表示前i組物品放在容量為j中的揹包中實現的最大價值

int main()

for(i = 0; i <= m; i++)

dp[0][i] = 0;

for(i = 1; i <= k; i++)

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

dp[i][j] = -inf;

for(i = 1; i <= k; i++)//第i組物品

}if(dp[k][m] < 0) printf("impossible\n");

else printf("%d\n",dp[k][m]);

}/*這題讓我有了將分組揹包轉為二維揹包的感覺*/

return 0;

}

hdu 3033(分組揹包)

題意 有s款運動鞋,乙個n件,總錢數為m,求不超過總錢數且每款鞋子至少買一雙的情況下,使價值最大。如果 有一款買不到,就輸出 impossible 解題思路 分組揹包,和揹包九講裡面不同的是,這裡要每一組至少有乙個。為了保證每一組都有被取,dp i j 初始化為 1,表示前i組,揹包容量為j時可獲得...

Hdu 3033(分組揹包)

hdu 3033 1 思路 這道題要求每組至少選1個,但是每一種只能選一次 與之前分組揹包的模板不一樣的是,之前要求每組至多選1個 之前的分組揹包是 一組中 某個不同體積下 可以選的揹包是i,然後判斷這個揹包選不選 這樣保證了每次都是每個體積的情況下只能選取乙個揹包。然而這道題目要求至少選乙個揹包,...

分組揹包 hdu3033

題意 有k種品牌的鞋子,要每種都收集到至少乙個,有n雙鞋子,給出輸入 屬於那種品牌,花費,收藏價值。每雙鞋子只可以買一雙,問收藏價值最大能多少 思路 既然每種只能一雙那一定01揹包。但是又要求每種必須有乙個,因此對於每種品牌的鞋子都需要進行遍歷。分析 分組揹包問題其實只是將01揹包問題使用二維化陣列...