TCSRM 591 div2(1000)(dp)

时间:2023-07-11 19:53:20

挺好的dp 因为有一点限制 必须任意去除一个数 总和就会小于另一个总和 换句话来说就是去除最小的满足 那么就都满足

所以是限制最小值的背包 刚开始从小到大定住最小值来背 TLE了一组数据 后来发现如果从大到小的话 就不用多加一重for了  前面算的已经记录下来 直接用就OK了 

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
using namespace std;
#define LL long long
#define N 3000010
LL dp[N],sum[N];
int a[],b[];
bool cmp(int a,int b)
{
return a>b;
}
class YetAnotherTwoTeamsProblem
{
public:
long long count(vector <int> skill)
{
int i,j,k,n;
for(i = ; i < (int)skill.size() ; i++)
a[i+] = skill[i];
LL ss=,s=;
n = (int)skill.size();
for(i = ;i <= n ;i++)
{
s+=a[i];
}
sort(a+,a+n+,cmp);
for(i = ; i <= n ;i++)
sum[i]=sum[i-]+a[i];
LL v = (s+)/;
LL vv = s/;
dp[] = ;
for(i = ; i < n ;i++)
{
for(k = v- ; k >= a[i] ; k--)
{
dp[k]+=dp[k-a[i]];
}
if(a[i]>vv)
ss+=;
int tt;
if(vv-a[i+]+<)
tt = ;
else
tt = vv-a[i+]+;
for(j = tt ; j < v ;j++)
ss+=dp[j];
}
return ss;
}
};