慶功會 解題報告(多重揹包模板)

2021-09-11 06:40:11 字數 1424 閱讀 6357

problem description

為了慶賀班級在校運動會上取得全校第一名成績,班主任決定開一場慶功會,為此撥款購買獎品犒勞運動員。期望撥款金額能購買最大價值的獎品,可以補充他們的精力和體力。

input

對於每組資料的第一行二個數n(n<=500),m(m<=6000),其中n代表希望購買的獎品的種數,m表示撥款金額。

接下來n行,每行3個數,v、w、s,分別表示第i種獎品的**、價值(**與價值是不同的概念)和購買的數量(買0件到s件均可),其中v<=100,w<=1000,s<=10。

output

對於每組資料輸出乙個數,表示此次購買能獲得的最大的價值(注意!不是**)。

sample input

5 1000 

80 20 4 

40 50 9 

30 50 7 

40 30 6 

20 20 1 

sample output

1040

解題思路:本題是典型的揹包問題中的多重揹包問題,有兩種寫法,一種是樸素演算法,第二種是二進位制優化後的寫法。下面將分別展示,作為模板。

**示例1:樸素演算法

#include#include#includeusing namespace std;

const int maxn = 550;

int w[maxn],val[maxn],num[maxn];

int f[7000];

void solve(int n,int m)else

}} }

cout << f[m] << endl;

}int main()

return 0;

}

**示例2:二進位制優化演算法

#includeint v[10001],w[10001];

int f[6001];

int n,m,n1;

int max(int a,int b)

int main()

v[++n1]=x*s;

w[n1]=y*s; //把s以2的指數分堆:1,2,4,…,2^(k-1),s-2^k+1,

}for(int i=1;i<=n1;i++)

for(int j=m;j>=v[i];j--)

f[j]=max(f[j],f[j-v[i]]+w[i]);

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

return 0;

}

慶功會 多重揹包問題c

慶功會 問題描述 w 為了慶賀班級在校運動會上取得全校第一名成績,班主任決定開一場慶功 會,為此撥款購買獎品犒勞運動員。期望撥款金額能購買最大價值的獎品,可以補充他們的精力和體力。輸入格式 w 第一行二個數 n n 500 m m 6000 其中n 代表希望購買的獎品的種數,m 表示撥款金額。w 接...

ssl2289 慶功會 多重揹包

慶功會time limit 10000ms memory limit 65536k total submit 235 accepted 94 case time limit 1000ms description 為了慶賀班級在校運動會上取得第一名的成績,班主任決定開一場慶功會,為此拔款購買獎品獎勵運...

DP 多重揹包 慶功會 HUSTOJ2821

為了慶賀班級在校運動會上取得全校第一名成績,班主任決定開一場慶功會,為此撥款購買獎品犒勞運動員。期望撥款金額能購買最大價值的獎品,可以補充他們的精力和體力。第一行二個數n n 500 m m 6000 其中n代表希望購買的獎品的種數,m表示撥款金額。接下來n行,每行3個數,v w s,分別表示第i種...