06 分組揹包 hdu 1712 3033

2021-06-08 00:46:16 字數 1522 閱讀 6964

內容見: 揹包九講

hdu 1712

**:

#include#includeusing namespace std;

int f[110];

int w[110][110];

int n,m;

void grouppack()}}

}int main()

memset(f,0,sizeof(f));

grouppack();

printf("%d\n",f[m]);

}return 0;

}

hdu 3033

如果①、②兩個迴圈的順序改變的話,一定會出錯!!! 

例如測試資料中第一種品牌有兩種產品: 4 - 6    、5 - 77 ,假設m = 300

若是:for t = 0------>len

for j = m ----->0

則第一次迴圈:  f [ i ] [ 300~4] = 6;

第二次迴圈 :  max  = f[ i ] [ 300 ] = 77+6; 

若是:for j = m ------> 0

for t = 0 ------->len

則t=0:  f [ i ] [ 300 ] = 6;  

t = 1時:    f[ i ] [300] = max  = 77;

所以第二種迴圈順序將會覆蓋原來較小的值,而不是「累加」,故而產生錯誤!

判斷取值時:

f[i][j]=max(f[i][j],f[i][j-v[i][t]]+w[i][t]); 是判斷該組中該種產品是取還是不取
f[i][j]=max(f[i][j],f[i-1][j-v[i][t]]+w[i][t]); // 是在之前i-1組的最值下取乙個該組產品(f[i-1][j-v]+w),和該組
// 產品最值情況進行比較,則f[i-1][j-v]+w保證了一定取該組中的乙個產品

**:

#include#includeusing namespace std;

int f[11][10010];

int v[11][1010],w[11][110],len[11];

int n,m,k;

int max(int a, int b)

void _grouppack()}}

}}int main()

memset(f,0,sizeof(f));

_grouppack();

int ans=0;

for(int i=m;i>=0;i--)

if(ans)

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

else printf("impossible\n");

}return 0;

}

hdu 1712 分組揹包

分組的揹包問題 問題 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 這些物品被劃分為若干組,每組中的物品互相衝突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。演算法 這個問題變成了每組物品有若干種策略 是選擇本組的某一件,還是一件...

hdu3535 01 分組揹包

hdu3535 稍微能理解一些了,至少取乙個的分組揹包。寫hdu3033的那題 網上沒有解釋好一點的題解 這題題解比較多 include include includeusing namespace std int n,t,m,s,w,v int dp 110 dp 110 int main int...

hdu 1712 分組揹包)

思路 這是一道簡單的分組揹包,因為每種課可以有多種選擇 花幾天時間在該課上。一旦作出選擇,就不能再選該課,就相當於有多組物品,每組內的物品互相衝突,最多只能選一件。偽碼 for 所有的組k for v v.0 for 所有的i屬於組k f v max 1 include2 const int max...