1. 程式人生 > >【DFS】石子歸併

【DFS】石子歸併

Description

你有一堆石頭質量分別為W1,W2,W3…WN.(W<=100000)現在需要你將石頭合併為兩堆,使兩堆質量的差為最小。

Input

測試資料第一行為整數N(1<=N<=20),表示有N堆石子。第二行為N個數,為每堆石子的質量。

Output

每組測試資料只需輸出合併後兩堆的質量差的最小值。

Sample Input

5
5 8 13 27 14

Sample Output

3

思路:
深搜,把所有的可能試一遍,然後求出質量差的最小值。

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,t,a[505]; void dfs(int k,int l,int r)//k表示還剩下多少個石子,l表示第一堆的質量,r表示第二堆的質量。 { if(k==0)//判斷是否還有未歸併的石子 { if(max(l,r)-min(l,r)<m)//判斷此次方案的質量差是否小於原紀錄最小的差 m=max(l,r)-min(l,r); } else//如果還有石子,繼續歸併 { dfs(k-1,l+a[k],r);//歸併到第一堆裡 dfs(k-1,l,r+a[k]);//歸併到第二堆裡 } } int main() { m=2147483647;//不要問為什麼賦值那麼大
scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); dfs(n,0,0); printf("%d",m); return 0; }