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。
点赞 6

相关推荐

牛客网
牛客企业服务