求助 一個算法

swallow_x 2006-04-03 04:57:32
要從一組數據中找出任意一種組合(一個,兩個,或三個……)相加等於某個特定的數,並記錄是哪幾個數的組合。
例如:a[]={100,1,200,2,500,3} b=800
   得到結果應該是a[0]+a[2]+a[4] = 800
請各位高手幫幫忙。謝謝
...全文
174 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sweig0721 2006-04-05
  • 打赏
  • 举报
回复
是的.學習!
-渔民- 2006-04-05
  • 打赏
  • 举报
回复
mark
stonepeter 2006-04-05
  • 打赏
  • 举报
回复
经典算法:组合问题。呵呵。
swallow_x 2006-04-05
  • 打赏
  • 举报
回复
謝謝 Knight94(愚翁) 但是我不知道怎麼給分 -_-||
止戈而立 2006-04-04
  • 打赏
  • 举报
回复
组合。。
lonelyair 2006-04-04
  • 打赏
  • 举报
回复
static void Main(string[] args)
{
int []a={100,1,200,2,500,3};
int b = 800;
int [] c=new int [6];
int IndexNum = 0;
if (FindArray(ref a, ref c, b, 0, 0, ref IndexNum))
{
Console.Write("a[{0}] + a[{1}] + a[{2}] = {3}", c[0], c[1], c[2],b);
Console.ReadLine();
}

}

public static bool FindArray(
ref int[] Values,
ref int[] Indexes,
int TotalValue,
int CurValue,
int StartIndex,
ref int IndexNum)
{
for (int i = StartIndex; i < Values.Length; i++)
if ((CurValue + Values[i]) <= TotalValue)
{
Indexes[IndexNum++] = i;
CurValue += Values[i];
if (CurValue == TotalValue) return true;
else if (FindArray(ref Values,
ref Indexes,
TotalValue,
CurValue,
i + 1,
ref IndexNum))
return true;
else
{
//Re-set value
CurValue -= Values[i];
//Indexes-- 改为:IndexNum--
Indexes[IndexNum--] = 0;
}
}
return false;
}
Knight94 2006-04-04
  • 打赏
  • 举报
回复
Sorry!
写错一个参数,即把“i”改成“i+1”即可,如
private bool FindArray(
ref int[] Values,
ref int[] Indexes,
int TotalValue,
int CurValue,
int StartIndex,
ref int IndexNum )
{
for ( int i = StartIndex; i < Values.Length; i++)
if ((CurValue + Values[i]) <= TotalValue)
{
Indexes[IndexNum++] = i;
CurValue += Values[i];
if (CurValue == TotalValue) return true;
else if (FindArray(ref Values,
ref Indexes,
TotalValue,
CurValue,
i + 1,
ref IndexNum))
return true;
else
{
//Re-set value
CurValue -= Values[i];
Indexes[Indexes--] = 0;
}
}
return false;
}


serversql 2006-04-03
  • 打赏
  • 举报
回复
这个算法应该比较复杂,你那一点分不够.至少要花2\3个小时
swallow_x 2006-04-03
  • 打赏
  • 举报
回复
好像是個死循環
Knight94 2006-04-03
  • 打赏
  • 举报
回复
private bool FindArray(
ref int[] Values,
ref int[] Indexes,
int TotalValue,
int CurValue,
int StartIndex,
ref int IndexNum )
{
for ( int i = StartIndex; i < Values.Length; i++)
if ((CurValue + Values[i]) <= TotalValue)
{
Indexes[IndexNum++] = i;
CurValue += Values[i];
if (CurValue == TotalValue) return true;
else if (FindArray(ref Values,
ref Indexes,
TotalValue,
CurValue,
i,
ref IndexNum))
return true;
else
{
//Re-set value
CurValue -= Values[i];
Indexes[Indexes--] = 0;
}
}
return false;
}

------Function Call-------
int[] Indexes = new int[yourValues.Length];
int IndexNum = 0;
bool blnRet = FindArray( ref yourValues,
ref Indexes,
yourTotalValue,
0,
0,
ref IndexNum );
if( blnRet )
{
for( int i = 0; i < IndexNum; i++ )
{
Console.WriteLine( string.Format("Index:{0} Value:{1}", Indexes[i], yourValues[Indexes[i]] ) );
}
}

111,092

社区成员

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

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

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