社区
C#
帖子详情
数组划分,两部分和相等[算法问题]
lovewangshu
2004-12-16 10:34:52
需要一个算法:
一个数组,需要把它分成两组,要使两组中的数的和相等.
思路是什么? 用C#怎么写能给一下代码嘛?谢谢
...全文
1962
14
打赏
收藏
数组划分,两部分和相等[算法问题]
需要一个算法: 一个数组,需要把它分成两组,要使两组中的数的和相等. 思路是什么? 用C#怎么写能给一下代码嘛?谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
linfengcyl
2004-12-18
打赏
举报
回复
楼上解法正点!:)
gzlucky
2004-12-17
打赏
举报
回复
纠正:排序是倒排。
gzlucky
2004-12-17
打赏
举报
回复
1. 先排序
2. 然后一个个地遍历每一个元素
. 取出一个元素,把它放入到求和后值最小的那个组中。
. 循环直至遍历完所有元素。
3. 输出
hanbingture
2004-12-17
打赏
举报
回复
我的思路,大家参考。
先求数组的和.把和除以2假设为half。然后比较数组中的每个数与half.如果有比half大的则无解,如果有正好等于一半的,则有唯一解,解是什么我就不说了。
如果上面的情况都没发生。
就把数组全排列,每次全排列后从第一个数开始加,当加到正好等于half,则前面部分为一个数组,后半部分为一个数组。
如果加到大于half则进行下一次全排列。
不过全排列是计算机算法中最忌讳的操作,很没效率。希望大家有更好的方法。
lovewangshu
2004-12-17
打赏
举报
回复
对,这里有个问题就是所有的方法都试过后(穷举后)还不行就是不能分了,但是有没有可以多种划分方法的情况出现呢?这样的问题属于算法里的什么问题呢?
zhy0101
2004-12-17
打赏
举报
回复
不可能吧,比如{1,2,4}就不能分,除非给定的数组可以这样分。
lovewangshu
2004-12-17
打赏
举报
回复
首先要排序,我也是这么想的,但是穷举要怎么实现呢?能给个具体的思路嘛?谢谢你
lovewangshu
2004-12-17
打赏
举报
回复
我突然想倒这个题可以用平衡二叉树来求解吗?左右子数分别为两组,组后使得整颗树平衡.
carloswu
2004-12-17
打赏
举报
回复
[您看看,half既然是和的一半,那么数组中肯定有比half大的数]
好好想一下再说:)
lovewangshu
2004-12-17
打赏
举报
回复
to hanbingture:
先求数组的和.把和除以2假设为half。然后比较数组中的每个数与half.如果有比half大的则无解,如果有正好等于一半的,则有唯一解
这句话好难理解哦.您看看,half既然是和的一半,那么数组中肯定有比half大的数,那"如果有比half大的则无解"不是说肯定没有解了吗?您的意思是不是表达错了?
您的gen()函数什么意思啊?我没看明白,用了递归法来做的话思路应该是什么呢?
hanbingture
2004-12-17
打赏
举报
回复
//利用全排列求
public static void Gen(int iPos,int len)
{
if(iPos==len)
{
int sum=0;
for(int i=0;i<len;i++)
{
sum+=s[i];
if(sum==half)
{
flag=true;
for(int j=0;j<=i;j++)
Console.Write(s[j].ToString()+",");
Console.Write(" | ");
for(int j=i+1;j<len;j++)
Console.Write(s[j].ToString()+",");
Console.WriteLine();
}
}
}
else
{
for(int i=0;i<len;i++)
{
if(!v[i])
{
s[iPos]=arr[i];
v[i]=true;
Gen(iPos+1,len);
v[i]=false;
}
}
}
}
}
hanbingture
2004-12-17
打赏
举报
回复
我按照我说的方法写了个程序,楼主可以看一下。两个数组是用||分开的。
using System;
class App
{
private static int[] arr;//原数组
private static int[] s; //排列用数组
private static bool[] v; //标志数组
private static int half; //数组和的一半
private static int flag=false;//是否成功
public static void Main()
{
arr=new int[]{5,3,2,4,6,86,34,23,12,97,35,23};
s=new int[arr.Length];
v=new bool[arr.Length];
for(int i=0;i<arr.Length;i++)
v[i]=false;
int sum=0;
foreach(int i in arr)
sum+=i;
if(sum%2!=0)//不能整除
{
Console.WriteLine("无解");
Console.ReadLine();
return;
}
else
{
half=sum/2;//求一半
Gen(0,arr.Length);
if(!flag)
Console.WriteLine("无解");
}
Console.ReadLine();
}
hanbingture
2004-12-17
打赏
举报
回复
我按照我说的方法写了个程序,楼主可以看一下。两个数组是用||分开的。
using System;
class App
{
private static int[] arr;//原数组
private static int[] s; //排列用数组
private static bool[] v; //标志数组
private static int half; //数组和的一半
private static int flag=false;//是否成功
public static void Main()
{
arr=new int[]{5,3,2,4,6,86,34,23,12,97,35,23};
s=new int[arr.Length];
v=new bool[arr.Length];
for(int i=0;i<arr.Length;i++)
v[i]=false;
int sum=0;
foreach(int i in arr)
sum+=i;
if(sum%2!=0)//不能整除
{
Console.WriteLine("无解");
Console.ReadLine();
return;
}
else
{
half=sum/2;//求一半
Gen(0,arr.Length);
if(!flag)
Console.WriteLine("无解");
}
Console.ReadLine();
}
timiil
2004-12-16
打赏
举报
回复
排序后穷举
LeeCode每日一题-简单篇
LeeCode每日一题-简单篇 每日一道
算法
题,一起学习一起进步,我会从简单题开始一步一步努力! 2020年12月29日–第一题 来自Leecode-1013 题目如下: 给你一个整数
数组
A,只有可以将其
划分
为三个和
相等
的非空
部分
时才返回 true,否则返回 false。 形式上,如果可以找出索引 i+1 < j 且满足 A[0] + A[1] + … + A[i] == A[i+1] + A[i+2] + … + A[j-1] == A[j] + A[j-1] + … + A[A.length
416. 分割等和子集 给定一个只包含正整数的非空
数组
。是否可以将这个
数组
分割成
两
个子集,使得
两
个子集的元素和
相等
。 注意: 每个
数组
中的元素不会超过 100
数组
的大小不会超过 200
分割等和子集 给定一个只包含正整数的非空
数组
。是否可以将这个
数组
分割成
两
个子集,使得
两
个子集的元素和
相等
。 注意: 每个
数组
中的元素不会超过 100
数组
的大小不会超过 200 官网解法 class Solution { public: bool canPartition(vector<int>& nums) { int n = nums.size(); if (n < 2) { return false; .
递归解决CSDN论坛上的小朋友分苹果
问题
RT,是CSDN上的,原帖内容如下: 采用递归,暴力解决方案如下: #include <stdio.h> #define MAXLEN 1024 void calc(int *data, int *status, int len, int *value1, int *value2) { int i; *value1 = *value2 = 0; for (i = 0; i < len; i++) { if (status[i.
Codeforces ~ 1006C ~ Three Parts of the Array(前缀和 + 二分)
题意 将一个长度为n的
数组
划分
为a,b,c三段(每一段都可以为空),使得a段和c段的和
相等
,问a段的和的最大值是多少? 思路 求前缀和,后缀和。然后从大到小枚举后缀,在前缀中查找
相等
,如果能找到且a,c
两
段不重叠,那么就是答案。注意开long long #include <bits/stdc++.h> using namespace std; const int MAXN ...
一个有意思的数学结论
结果的二进制位上的每一位究竟是 1 or 0 是根据这组数字的二进制在这以为上的 1 的奇偶情况,如果1的个数是奇数,那么这一位是1,否则是0。不难发现:
两
个区间异或和相同,所以
两
边数字的二进制的各个位上的1的奇偶性是一致的,
划分
区间时中间指针的移动,
两
个区间的奇偶性始终保持一直。],讲这个
数组
分成
两
个区间,使得左半边的异或和==右半边的异或和,即。发现了一个比较有意思的数学结论,在这里分享一下。异或和,就是将这些数字连续异或所得的数字,x=,即是[i ~ j]这一段的异或和。
C#
111,129
社区成员
642,536
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章