分組揹包hdu 3033 至少選乙個

2021-07-25 21:32:12 字數 1211 閱讀 1383

感謝某神的提供的資料。 關鍵還是自己不夠細心, b==0?

這題的狀態轉移細節很多

首先1.如何保證每組物品都至少選乙個——> dp置空,dp[1][0]置0.

從第k組,轉移到第k+1組的時候,去掉o1揹包常見的那種不選的繼承狀態->(dp[k+1][j]=dp[k][j])

最主要的狀態方程如下

dp[k+1][j]=max(dp[k+1][j],max(dp[k][j-w[i]]+v[i],dp[k+1][j-w[i]]+v[i]) );
還是特殊判斷 j-w[i] ,一般老來j -w[i] 不能為零,不然意味著之前的幾組物品就 零重量貢獻?不滿足每組都至少選乙個,例外的情況是從第0組轉移的情況,以及存在重量為0的物品。

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const ll inf=0x3f3f3f3f;

const

long

long maxn=10010;

int k,n,w;

int dp[15][maxn];

int c[maxn],w[maxn],v[maxn];

int main()

for(int i=0;i<=k+2;i++)

}dp[1][0]=0;

for(int k=1;k<=k;k++)else

if(dp[k+1][j-w[i]]!=-inf)else

if(dp[k][j-w[i]]!=-inf)else }}

}}int x=-inf;

// printf("..%d\n",dp[2][6]);

for(int i=0;i<=w;i++)

}if(x==-inf)

printf("impossible\n");

else

printf("%d\n",x);

}return

0;}

分組揹包 hdu3033

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

hdu3033 分組揹包(每組最少選乙個)

題意 有s款運動鞋,乙個n件,總錢數為m,求不超過總錢數且每款鞋子至少買一雙的情況下,使價值最大。如果有一款買不到,就輸出 impossible 1 n 100 1 m 10000 題解 首先明顯這是乙個分組揹包。impossible 就直接看看每組最便宜的是否買得起。因為每組最少選乙個,所以我們可...

hdu 3033(分組揹包)

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