1. 程式人生 > >#156-[揹包DP]慶功會

#156-[揹包DP]慶功會

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

多重揹包模板

#include <iostream>

#define SIZE 6010

using namespace std;

int dp[SIZE];

int main(int argc, char** argv)
{
	int n, t, i, s, w, c, count;
	
	scanf("%d%d", &n, &t);
	
	while (n--)
	{
		scanf("%d%d%d", &w, &c, &s);
		count = 0;
		while (s--)
		{
			if (++count * w > t) // 如果已經大於揹包容量就直接跳過
			{
				break;
			}
			for (i = t; i >= w; --i)
			{
				dp[i] = max(dp[i], dp[i-w] + c); // 進行動態規劃
			}
		}
	}
	
	printf("%d", dp[t]);
	
	return 0;
}