const int MAX=500;
bool dp[MAX+1][MAX+1];


void beibao(int weight){
    for(int i=MAX;i>=0;--i){
        for(int j=MAX;j>=0;--j){ 
            if(i>=weight&&dp[i-weight][j]){
                 dp[i][j]=true;
            }
            if(j>=weight&&dp[i][j-weight]){
                 dp[i][j]=true;    
            }  }
    }
}

int getNum(int* a,int n){
    memset(dp,false,sizeof(dp));
    dp[0][0]=true;
    for(int i=0;i<n;++i) beibao(a[i]);
    for(int i=MAX;i>=0;--i) if(dp[i][i]) return i;
} 

早上想了一下,感觉可以用二重背包来写,要注意状态转移要从更大的状态开始操作,细节可参考上述代码。
复杂度为O(n*m^2)  n最大为50,m最大为500。