ZOJ 3956——Course Selection System(01揹包)
阿新 • • 發佈:2018-11-16
因為c的值很小,所以以c看做重量,把h當做價值
01揹包,取儘可能大的h
因為當c固定時,這個式子只需要看前面 h*h-h*c=h*(h-c)
h大於c時,肯定h越大越好
h小於c時,表示式的值必定小於零,肯定是不考慮的
#include <cstdio> #include <cmath> #include<vector> #include<cstring> #include<algorithm> #include<cmath> #include<stack> #include<string> #include<iostream> #include<set> #include<vector> using namespace std; struct node{ int a,b; }s[510]; long long dp[50010]; int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); long long sum=0; memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++) { scanf("%d%d",&s[i].a,&s[i].b); sum+=s[i].b; } for(int i=0;i<n;i++) { for(int j=sum;j>=s[i].b;j--) { dp[j]=max(dp[j],dp[j-s[i].b]+s[i].a); } } long long maxn=0; for(int i=0;i<=sum;i++) { maxn=max(maxn,dp[i]*dp[i]-dp[i]*i-i*i); } printf("%lld\n",maxn); } return 0; }