版权声明:https://blog.csdn.net/huashuimu2003 https://blog.csdn.net/huashuimu2003/article/details/84893588
题目
描述 Description
小x,小y和小z在焦作一中东南角的臭水沟里发现了一堆宝藏。
这堆宝藏是由n (1 <= n <= 20)包元宝组成,每包含si (1 <= si <= 100)个元宝,三个人很光明正大的决定把这些元宝私分。
当然,他们都希望把这批宝藏尽可能的平分,他们又约定不能把包给拆开。这样,平分的标准就是获得元宝个数最多的那个人的元宝个数尽可能的小,他们约定,谁先算出,谁可以先挑。
例如:现在有8包元宝,每包分别有元宝:2 4 5 8 9 14 15 20
最公平的分法是:
1: 2 9 15 一共获得 26
2: 4 8 14 一共获得26
3: 5 20 一共获得 25
那么26就是我们需要的
现在,眼红的你,能算出获得元宝最多的那个人最少能获得多少元宝么?
输入格式 Input Format
第一行一个整数n
接下来n行,每行一个整数,表明每包含有元宝的个数。
输出格式 Output Format
一个整数,如题目描述所求。
样例输入 Sample Input
8
14
2
5
15
8
9
20
4
样例输出 Sample Output
26
时间限制 Time Limitation
1s
注释 Hint
【数据范围】
30% n<=5
来源 Source
usaco2012 jan
题解
这并不是正解,而是乱搞,然而搞过了,%杨宇航大佬。
代码
#include<bits/stdc++.h>
using namespace std;
const int _=100;
inline int read()
{
int f=1,num=0;
char ch=getchar();
while (ch<'0'||ch>'9') { if (ch=='-') f=-1; ch=getchar(); }
while (ch>='0'&&ch<='9') num=(num<<1)+(num<<3)+ch-'0',ch=getchar();
return num*f;
}
int n,d[_],sum[_],cnt,ans=1000000,minn;
bool cmp(int a,int b)
{
return a>b;
}
void dfs(int cnt,int a,int b,int c)
{
if (clock()>900)
{
printf("%d",ans);
exit(0);
}
if (min(a,min(b,c))+sum[n]-sum[cnt-1]<minn) return ;
if (cnt>n)
{
ans=min(ans,max(a,max(b,c)));
minn=max(minn,min(a,min(b,c)));
return;
}
dfs(cnt+1,a+d[cnt],b,c);
dfs(cnt+1,a,b+d[cnt],c);
dfs(cnt+1,a,b,c+d[cnt]);
}
int main()
{
n=read();
for (int i=1;i<=n;++i)
d[i]=read();
sort(d+1,d+n+1,cmp);
for (int i=1;i<=n;++i)
sum[i]=sum[i-1]+d[i];
dfs(2,d[1],0,0);
printf("%d",ans);
return 0;
}