Course Selection System ZOJ - 3956 01背包+思维

Course Selection System

 ZOJ - 3956 

这个题目居然是一个01背包,我觉得好难想啊,根本就没有想到。

这个题目把题目给的转化为  ans = a*a-a*b-b*b

这个可以看成 当b不变的时候 a 越大越好。

这个就可以用01背包来解决

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <stack>
#include <map>
#include <string>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 5e4 + 10;
ll dp[maxn];
int c[maxn], h[maxn];

int main()
{
	int t;
	scanf("%d", &t);
	while(t--)
	{
		int n;
		scanf("%d", &n);
		memset(dp, 0, sizeof(dp));
		for (int i = 1; i <= n; i++) scanf("%d%d", &h[i], &c[i]);
		for (int i = 1; i <= n; i++) {
			for (int j = 50000; j >= c[i]; j--) {
				dp[j] = max(dp[j], dp[j - c[i]] + h[i]);
			}
		}
		
		ll ans = 0;
		for(int i=0;i<=50000;i++)
		{
			ans = max(ans, dp[i] * dp[i] - dp[i] * i - i * 1ll * i);
		//	printf("i=%d ans=%lld\n", i, ans);
		}
		printf("%lld\n", ans);
	}
	return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/EchoZQN/p/11360276.html