Cavs level
获赞
40
粉丝
11
关注
4
看过 TA
14
北京航空航天大学
2018
算法工程师
IP属地:广东
C++爱好者 图形图像算法工程师
私信
关注
2017-09-26 10:29
已编辑
北京航空航天大学 算法工程师
输入:一个正整数数组a,最多包含50个元素,每个元素最大1000,所有元素的和最大为1000。可能包含重复元素。 找出数组中两个不相交子集,使得两个子集中元素的和相同,两个子集不一定包含a中所有元素,即可以有元素不在两个子集中。求满足这样条件的最大子集的和,不存在返回0。 例如,a=[1,2,2,2,3,4,6],子集[1,2,3,4]和[2,2,6]为满足条件的两个子集,则返回10。 a=[1,4,5,6],子集[1,5]和[6]满足条件,返回6。 求大神解答。
Leoric: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。
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务