求个算法________________________________________________________

编程有钱人了 2010-11-24 10:45:31
两个条件:
1:输入一个数 X 和: 20<=X<=165;
2:一个数N:个数 1<=N<=5;
例如
X=100; N=5;
因为N=5 所以就有 X1+X2+X3+X4+X5=100;
X1到X5 都是小于等于35大于等于1的,且彼此不重复


再例如:X=120;N=3
那么就是 X1+X2+X3=120;X1到X3 都是小于等于35 大于等于1的,且彼此不重复
依次类推!
要求把所有的可能都列举出来!不能遗漏
...全文
449 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zerodegrees 2010-11-25
  • 打赏
  • 举报
回复
看着真累。。。帮顶吧
hwbox 2010-11-25
  • 打赏
  • 举报
回复
优化下

using System;
using System.Collections.Generic;
using System.Text;

namespace addtest
{
class Program
{
static int N, X;

static void Main(string[] args)
{
bool Nflag = true, Xflag = true;
while (Nflag)
{
Console.WriteLine("请输入参数N(N大于等于1小于等于5):");
string strN = Console.ReadLine();
if (strN == "exit")
{
return;
}
try
{
N = Convert.ToInt16(strN);
Nflag = false;
}
catch
{
N = 0;
}
}
while (Xflag)
{
Console.WriteLine("请输入参数X(X大于等于20小于等于165):");
string strX = Console.ReadLine();
if (strX == "exit")
{
return;
}
try
{
X = Convert.ToInt16(strX);
Xflag = false;
}
catch
{
X = 0;
}
}


for (int i = 1; i < 36; i++)
{
if (addx(0, i, 1, ""))
{
break;
}
}

Console.ReadLine();
}

public static bool addx(int AddX, int thisX, int thisN, string writeStr)
{
string thiswriteStr;
int thisAddX;
if (thisN > N)
{
//thiswriteStr = writeStr + "N溢出!"
//Console.WriteLine(thiswriteStr);
return true;
}

thiswriteStr = writeStr + "(X" + thisN.ToString() + ":" + thisX.ToString() + ")";
thisAddX = AddX + thisX;

if (thisAddX > (X - (N - thisN)))
{
//thiswriteStr = writeStr + "X溢出!"
//Console.WriteLine(thiswriteStr);
return true;
}

if ((thisN == N) && (thisAddX==X))
{
Console.WriteLine(thiswriteStr);
}
for (int i = 1; i < 36; i++)
{
if (addx(thisAddX, i, thisN + 1, thiswriteStr))
{
break;
}
}
return false;
}
}
}


绿色夹克衫 2010-11-25
  • 打赏
  • 举报
回复
凑合能算,数再大的话,需要把剪枝部分(还有最后1个数的计算)优化一下,不考虑输出的话,速度提高个10倍是有可能的


using System;

namespace CsdnTest
{
class Program
{
static void Main(string[] args)
{
Solve(5, 100, 35, string.Empty);
Console.ReadKey();
}

static void Solve(int remain, int remainSum, int max, string selected)
{
if (remain * max < remainSum || max < 0 || remainSum < 0)
return;

if (remain == 0 && remainSum == 0)
{
Console.WriteLine(selected);
return;
}

Solve(remain, remainSum, max - 1, selected);
Solve(remain - 1, remainSum - max, max - 1, selected + max.ToString() + " ");
}
}
}
hwbox 2010-11-25
  • 打赏
  • 举报
回复
擦比多还快!
hwbox 2010-11-25
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.Text;

namespace addtest
{
class Program
{
static int N, X;

static void Main(string[] args)
{
bool Nflag = true, Xflag = true;
while (Nflag)
{
Console.WriteLine("请输入参数N(N大于等于1小于等于5):");
string strN = Console.ReadLine();
if (strN == "exit")
{
return;
}
try
{
N = Convert.ToInt16(strN);
Nflag = false;
}
catch
{
N = 0;
}
}
while (Xflag)
{
Console.WriteLine("请输入参数X(X大于等于20小于等于165):");
string strX = Console.ReadLine();
if (strX == "exit")
{
return;
}
try
{
X = Convert.ToInt16(strX);
Xflag = false;
}
catch
{
X = 0;
}
}


for (int i = 1; i < 36; i++)
{
addx(0, i, 1, "");
}

Console.ReadLine();
}

public static void addx(int AddX, int thisX, int thisN, string writeStr)
{
string thiswriteStr;
int thisAddX;
if (thisN > N)
{
//thiswriteStr = writeStr + "N溢出!"
//Console.WriteLine(thiswriteStr);
return;
}

thiswriteStr = writeStr + "(X" + thisN.ToString() + ":" + thisX.ToString() + ")";
thisAddX = AddX + thisX;

if (thisAddX > (X - (N - thisN)))
{
//thiswriteStr = writeStr + "X溢出!"
//Console.WriteLine(thiswriteStr);
return;
}

if ((thisN == N) && (thisAddX==X))
{
Console.WriteLine(thiswriteStr);
}
for (int i = 1; i < 36; i++)
{
addx(thisAddX, i, thisN + 1, thiswriteStr);
}
return;
}
}
}

beargo 2010-11-25
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20101012/13/a6381631-dd9d-4d0e-87b9-b3fb1ef6fc2e.html


思路差不多..
hwbox 2010-11-25
  • 打赏
  • 举报
回复
看错题了,没注意不重复,LZ还给分,实在人那
darksmile 2010-11-25
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace XN {
class Program {
private static int m_level = 0;
private static int m_x = 20;
private static int m_n = 1;
private static int m_s = 1;

private static int[] m_numbers = new int[6];

static void Main(string[] args) {
Console.Write("Input X(20 <= X <= 165): ");
m_x = int.Parse(Console.ReadLine());
Console.Write("Input N(1 <= X <= 5): ");
m_n = int.Parse(Console.ReadLine());

Console.WriteLine("Running...");
TryNextNumber(0);
Console.WriteLine("OK.");

Console.ReadLine();
}

static void TryNextNumber(int st) {
++m_level;

for (int i = st + 1; i <= 35; ++i) {
m_numbers[m_level - 1] = i;

if (m_level == m_n) {
// 目标迭代层数
ValidateNumbers();
} else {
TryNextNumber(i);
}
}

--m_level;
}

static void ValidateNumbers() {
int sum = 0;
for (int i = 0; i < m_level; ++i) {
sum += m_numbers[i];
}

if (sum == m_x) {
Console.Write("{0, 2:D}. ", m_s++);
for (int i = 0; i < m_level; ++i) {
Console.Write("{0,2:D} ", m_numbers[i]);
}
Console.Write("\r\n");
}
}
}
}
游子 2010-11-25
  • 打赏
  • 举报
回复
我静悄悄的路过。。
三岁、就很帅 2010-11-25
  • 打赏
  • 举报
回复
这个……mark
绿色夹克衫 2010-11-25
  • 打赏
  • 举报
回复
把输出部分的注释去掉
using System;

namespace CsdnTest
{
class Program
{
static void Main(string[] args)
{
int selectCount = 5, sum = 100, max = 35;
Solve(selectCount, sum, max, new int[selectCount]);
Console.ReadKey();
}

static void Solve(int remainCount, int remain, int max, int[] selected)
{
if (max < remainCount || remain < remainCount || remainCount * max < remain)
return;

if (remainCount == 1 && remain <= max)
{
selected[remainCount - 1] = remain;
//需要输出就去掉注释,为测试剪枝幅度,注释掉了
for(int i = selected.Length - 1; i >= 0; i--)
Console.Write("{0} ", selected[i]);

Console.WriteLine();
return;
}

Solve(remainCount, remain, max - 1, selected);
selected[remainCount - 1] = max;
Solve(remainCount - 1, remain - max, max - 1, selected);
}
}
}

[Quote=引用 19 楼 wangjun8868 的回复:]
这个怎么不管用了
[/Quote]
编程有钱人了 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 litaoye 的回复:]

简单优化了一下,可以算稍微大一点的,比如10个不超过40的数,和为200,解的数量本身就是指数级的,不会有太好的方法。如果只求解的数量,可以用动态规划。

C# code
using System;

namespace CsdnTest
{
class Program
{
static void Main(string[] args)
{
……
[/Quote]
这个怎么不管用了
freetd 2010-11-25
  • 打赏
  • 举报
回复
。。。。。。。。。。。
编程有钱人了 2010-11-25
  • 打赏
  • 举报
回复
谢谢大家了!
ycg_893 2010-11-25
  • 打赏
  • 举报
回复
X1+X2+X3=120,是举例吧!这个值就算是35+35+35也不等于120呀!
绿色夹克衫 2010-11-25
  • 打赏
  • 举报
回复
简单优化了一下,可以算稍微大一点的,比如10个不超过40的数,和为200,解的数量本身就是指数级的,不会有太好的方法。如果只求解的数量,可以用动态规划。

using System;

namespace CsdnTest
{
class Program
{
static void Main(string[] args)
{
int selectCount = 10, sum = 200, max = 40;
Solve(selectCount, sum, max, new int[selectCount]);
Console.ReadKey();
}

static void Solve(int remainCount, int remain, int max, int[] selected)
{
if (max < remainCount || remain < remainCount || remainCount * max < remain)
return;

if (remainCount == 1 && remain <= max)
{
selected[remainCount - 1] = remain;
//需要输出就去掉注释,为测试剪枝幅度,注释掉了
//for(int i = selected.Length - 1; i >= 0; i--)
// Console.Write("{0} ", selected[i]);

//Console.WriteLine();
return;
}

Solve(remainCount, remain, max - 1, selected);
selected[remainCount - 1] = max;
Solve(remainCount - 1, remain - max, max - 1, selected);
}
}
}
编程有钱人了 2010-11-24
  • 打赏
  • 举报
回复
我数学不好!帮帮忙

111,129

社区成员

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

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

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