【DFS】石子歸併
阿新 • • 發佈:2018-12-10
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;
}