p1846 [2.5]寶藏分配
阿新 • • 發佈:2018-12-09
題目
描述 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;
}