Course Selection System
这个题目居然是一个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 ", i, ans); } printf("%lld ", ans); } return 0; }