1. 程式人生 > >POJ 2392 Space Elevator / 體積不定的多重揹包

POJ 2392 Space Elevator / 體積不定的多重揹包

對於體積不變 可以先排個序 這樣對於體積大的物品 轉移時比他小的狀態都算出來了

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 444;
struct block
{
	int a, b, c;
}a[maxn];

int dp[maxn*100];

bool cmp(block a, block b)
{
	return a.b < b.b;
}
int main()
{
	int n;
	scanf("%d", &n);
	for(int i = 1; i <= n; i++)
		scanf("%d %d %d", &a[i].a, &a[i].b, &a[i].c);
	sort(a+1, a+n+1, cmp);
	dp[0] = 1;
	for(int i = 1; i <= n; i++)
	{
		for(int k = 1; k <= a[i].c; k++)
		{
			for(int j = a[i].b; j >= a[i].a; j--)
			{
				dp[j] |= dp[j-a[i].a];
			}
		}
	}
	int i, ans = 0; 
	for(i = 40000; i >= 0; i--)
		if(dp[i])
			break;
	printf("%d\n", i);
	return 0;
}