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

相关推荐

不愿透露姓名的神秘牛友
06-27 14:11
很喜欢小米的新车,校招薪资每月22k,攒多久能买?
测试糕手手:别看工资,先看现金流存款。有50W存款以上再考虑,车是消耗品,选适合自己的重要。你有钱就当我没说过
点赞 评论 收藏
分享
06-26 15:33
青岛工学院 Java
积极的秋田犬要冲国企:他现在邀请我明天面试
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务