1. 程式人生 > >p1846 [2.5]寶藏分配

p1846 [2.5]寶藏分配

題目

描述 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; }