数组划分,两部分和相等[算法问题]

lovewangshu 2004-12-16 10:34:52
需要一个算法:
一个数组,需要把它分成两组,要使两组中的数的和相等.
思路是什么? 用C#怎么写能给一下代码嘛?谢谢
...全文
1891 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
排序后穷举

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧