這樣搜尋不錯:
#include<stdio.h>#include<math.h>int a[10000];int dd;//用dd來儲存最小差 void fun(int sum,int cur,int m,int i) { if (i<m)//最多選m個 { //假設cur為其中一個的分得的和,如,sum=67,cur=35,t1=-3; int t1=sum-2*cur; if (t1<0) t1=-t1; if (t1<dd) //記下最小的t1; dd=t1; fun(sum,cur+a[i+1],m,i+1);//選a[i+1] fun(sum,cur,m,i+1);//不選a[i+1]; }}int main(){ int m; int i,j,sum=0; while (scanf("%d",&m)!=EOF) { sum=0; for (i=0;i<m;i++) { scanf("%d",&a[i]); sum=sum+a[i]; } dd=sum; fun(sum,a[0],m,0);printf("%d\n",dd); } return 0;}
超短時間:
#include <stdio.h>#define max(a,b) a>b?a:bint V,ans,n,w[21],sum[21];void dfs(int i,int cnt){ if(i == 0) { ans = max(ans,cnt); return ; } if(ans == V || cnt+sum[i] <= ans) //cut return ; if(cnt+w[i] <= V) dfs(i-1,cnt+w[i]); dfs(i-1,cnt);}int main(){ while(~scanf("%d",&n)) { ans = 0; for(int i=1;i<=n;i++) { scanf("%d",&w[i]); sum[i] = sum[i-1] + w[i]; } V = sum[n]/2; dfs(n,0); printf("%d\n",sum[n]-2*ans); } return 0;}
搜尋前一定要想好搜尋角度……