#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int read(){
int x=0,f=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=1;ch=getchar();}
while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
return f?-x:x;
}
int a[N],dp[7100000],res[7100000],n,Max;
int mod = 1e9+7;
//bitset<1400000> f;
int main()
{
n = read();dp[0] = 1;
for(int i = 1;i <= n;i++) {
a[i] = read();
for(int j = Max;j >= 0;j--) dp[j+a[i]] = (1LL * dp[j+a[i]] + dp[j] + mod)%mod;
Max += a[i];
}
int ans = 0,pos = 0;
for(int i = 1;i <= n;i++) {
int sum = 0;
for(int j = 0;j <= Max;j++)
{
res[j] = dp[j];
if(j >= a[i]) res[j] = (1LL * res[j] - res[j-a[i]] + mod) % mod;
if(res[j]) sum++;
}
if(sum > ans || (sum == ans && a[i] < a[pos])){
ans = sum;pos = i;
}
}
for(int i = a[pos];i <= Max;i++) {
dp[i] = (1LL * dp[i] - dp[i - a[pos]] + mod) % mod;
}
for(int i = 1;i <= n;i++) {
if(i == pos) continue;
for(int j = 0;j <= Max-a[i];j++) dp[j] = (1LL * dp[j] + dp[j + a[i]] + mod) % mod;
}
for(int i = 1;i <= Max+1;i++){
if(!dp[i]) {
printf("%d %d\n",a[pos],i);
break;
}
}
return 0;
// f[7000*n] = 1;
// for(int i = 1;i <= n;i++) {
// if(i != pos) f = f|(f<<a[i])|(f>>a[i]);
// }
// for(int i = 1;i <= Max+1;i++){
// if(!f[i+7000*n]) {
// printf("%d %d\n",a[pos],i);
// return 0;
// }
// }
return 0;
}
这个 O(n2m) 的代码被卡成 60 分,换了 bitset 一样。
(LOJ能过)