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

时间:2023-03-09 00:04:13
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;
}