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

2022-05-31 07:42:09 字數 1024 閱讀 7541

【題意】

有s款運動鞋,乙個n件,總錢數為m,求不超過總錢數且每款鞋子至少買一雙的情況下,使價值最大。如果有一款買不到,就輸出「impossible"。

1<=n<=100  1 <= m<= 10000 

【題解】

首先明顯這是乙個分組揹包。

impossible 就直接看看每組最便宜的是否買得起。

因為每組最少選乙個,所以我們可以這樣dp:

f[k][j]表示當前掃到第k組,容量為j。

f[k][j]可由三個更新:

f[k][j]=f[k][j] 不選當前物品

f[k][j]=f[k-1][j-b[i]]+c[i] 選擇當前物品,並且是在該組中第一次選物品

f[k][j]=f[k][j-b[i]]+c[i] 選擇當前物品,並且不是在該組中第一次選

因為f[k][j]初始值為0,所以它最少都會買一樣東西(由第二條更新得到)

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;910

const

int n=11000,s=110;11

intn,m,k,a[n],b[n],c[n],mn[s],d[s][s],f[s][n];

1213

int maxx(int x,int y)

14int minn(int x,int y)

1516

intmain()

1729

int x=0;30

for(int i=1;i<=k;i++) x+=mn[i];

31if(m"

impossible\n");

32else

3344}45

}46 printf("

%d\n

",f[k][m]);47}

48}49return0;

50 }

hdu 3033(分組揹包)

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

Hdu 3033(分組揹包)

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

hdu3033 分組揹包變形

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