感謝某神的提供的資料。 關鍵還是自己不夠細心, 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時可獲得...