Hdu 3033(分組揹包)

2021-09-24 03:45:17 字數 1008 閱讀 2411

hdu 3033

(1)思路:

這道題要求每組至少選1個,但是每一種只能選一次(與之前分組揹包的模板不一樣的是,之前要求每組至多選1個)。

之前的分組揹包是(一組中(某個不同體積下(可以選的揹包是i,然後判斷這個揹包選不選))),

這樣保證了每次都是每個體積的情況下只能選取乙個揹包。

然而這道題目要求至少選乙個揹包,所以將之前的分組揹包的2,3層迴圈的位置交換一下,就變為了

(選取某個揹包(在體積為j的情況下)),這樣就不止乙個揹包了。

而且狀態轉移方程也要改變,

(1)分別從當前組更新(dp[i][j] = dp[i][j-wi[pos]]+ci[pos];)

(2)從當前組的上一組更新(dp[i][j] = dp[i-1][j-wi[pos]]+ci[pos];)

注意:(1)(2)的先後不能交換,如果w[i] = 0的情況可能會是:

dp[i][j] = dp[i-1][j-0]+v;

dp[i][j] = dp[i][j-0]+v;

相當於新增了兩次v。

(2)**:

參考文章

#include#include#includeusing namespace std;

const int maxn = 10005;

int n,m,k,wi[maxn],ci[maxn],bj[12][maxn],dp[12][maxn];

int main(void)

//for(int i=0;i<12;i++)

for(int j=0;j=wi[pos];j--)

}} if(dp[k][m]==-1) printf("impossible\n");

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

} return 0;

}

hdu 3033(分組揹包)

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

hdu3033 分組揹包變形

題意 n個物品,k個組,每個物品只能屬於乙個組,求至少每個組選乙個物品實現的最大價值 這是我的第一道分組揹包,這個和揹包九講裡面的那個典型例子不同,想了好久,都感覺沒有辦法確定每個組至少選乙個 所以看了題解,我用dp i j 表示前i組物品,放在容量為j的揹包裡面實現的最大價值,這裡我感覺到了要求恰...

分組揹包 hdu3033

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