给定33个数 从33个中选6个(可以重复) 加和等于150 统计有多少种排列方法 JAVA怎么编写啊?

heguodong 2009-11-23 10:59:27
给定33个数(1,2,3,4,5...33) 从33个中选6个(可以重复) 加和等于150 统计有多少种排列方法 JAVA怎么编写啊?
谁能解答一下 谢谢
原帖 http://topic.csdn.net/u/20091116/20/b8e6f325-d14f-4133-abbb-220180576f9f.html
...全文
566 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hejuan250229087 2009-11-24
  • 打赏
  • 举报
回复
楼主很厉害,学习一下
heguodong 2009-11-23
  • 打赏
  • 举报
回复
//我个人有一个想法,请人验证这个思路的正确性,欢迎讨论
using System;
using System.Collections.Generic;
using System.Text;

/* 直接根据排列组合的话量级很大,33的6次方的量级,在这个量级下做一个长时间计算的后台程序还可以,如果需要跟前台界面密切结合,反应就太慢了

* 所以想到了我们经常用的弹簧,用6个弹簧模拟这个问题
* 思路:每根弹簧的最大长度是33,最小长度是1,把6根弹簧串起来,总共长度保持在150,起始状态是每根弹簧长度25
*
* 然后我们可以开始往一边推弹簧,第一个推倒最大长度33后推第二个,一直重复道最后一根不能推动为止
* 记录整个过程中每根弹簧的长度,就是我们要的6个数字
* 考虑到两边是对称的,往两边推出来的长度是重复的,素以只需要往一边推
*/
//模拟单个弹簧的类
class Spring
{
int m_MinLength;
int m_MaxLength;
int m_Length;
public int Length
{
get { return m_Length; }
}
public Spring(int min, int max,int len)
{
System.Diagnostics.Debug.Assert(min > 0);
System.Diagnostics.Debug.Assert(len <= 33);
System.Diagnostics.Debug.Assert(len > 0);
System.Diagnostics.Debug.Assert(max <= 33);
System.Diagnostics.Debug.Assert(max >= min);
m_MinLength = min;
m_MaxLength = max;
m_Length = len;
}
//判断是否可以被拉长
public bool CanLength()
{
if (m_Length >= 33) return false;//超过33就不能继续拉长了
return true;
}
//拉长弹簧
public void Lengthen()
{
++m_Length;
}
//判断弹簧是否可以被压缩
public bool CanShort()
{
if (m_Length <= 1) return false;
return true;
}
//缩短弹簧
public void Shorten()
{
--m_Length;
}
}

//模拟一组弹簧串联
public class SpringConnect
{
readonly int m_FixLength;//串联起来的弹簧的固定不变得长度和
List <Spring> m_Springs;//串起来的弹簧串
/// <summary>
/// 构造函数
/// </summary>
/// <param name="totalLen">固定的总长度 </param>
/// <param name="springCount">弹簧的个数 </param>
/// <param name="springLen">弹簧的初始长度 </param>
public SpringConnect(int totalLen,int springCount,int springLen)
{
System.Diagnostics.Debug.Assert(totalLen > 0);
m_FixLength = totalLen;
m_Springs = new List <Spring>();
for (int i = 0; i < springCount; ++i)
{
Spring sp = new Spring(1, 33, springLen);
m_Springs.Add(sp);
}
}
//拉动弹簧,从一边往另一边顺序拉动弹簧
public void DragSpring()
{
//因为要保证总体长度不变,所以最后一根弹簧不能依靠自身的操作变化长度,只能由前面的弹簧改变长度
Spring curSpring;//当前正在被操作的弹簧
for (int i = 0; i < m_Springs.Count - 1; ++i)
{
curSpring = m_Springs[i];
Spring nxtSpring = m_Springs[i + 1];
while (true)
{
if (!curSpring.CanLength()) break;//如果当前弹簧不能被拉长,则继续下一个弹簧
if (!nxtSpring.CanShort()) break;//如果紧接在后面的弹簧不能被压缩,则继续下一个弹簧
curSpring.Lengthen();//拉长当前弹簧
nxtSpring.Shorten();//缩短后续弹簧
//输出当前的一组数字
for (int j = 0; j < m_Springs.Count; ++j)
{
Console.Write(m_Springs[j].Length);
Console.Write(" ");
}
Console.Write("\r\n");
}
}
}
}
namespace findnum
{
class Program
{
static void Main(string[] args)
{
SpringConnect cn = new SpringConnect(150, 6, 25);
cn.DragSpring();
}
}
}

//在VS2005环境下测试过
最终的结果如下
26 24 25 25 25 25
27 23 25 25 25 25
28 22 25 25 25 25
29 21 25 25 25 25
30 20 25 25 25 25
31 19 25 25 25 25
32 18 25 25 25 25
33 17 25 25 25 25
33 18 24 25 25 25
33 19 23 25 25 25
33 20 22 25 25 25
33 21 21 25 25 25
33 22 20 25 25 25
33 23 19 25 25 25
33 24 18 25 25 25
33 25 17 25 25 25
33 26 16 25 25 25
33 27 15 25 25 25
33 28 14 25 25 25
33 29 13 25 25 25
33 30 12 25 25 25
33 31 11 25 25 25
33 32 10 25 25 25
33 33 9 25 25 25
33 33 10 24 25 25
33 33 11 23 25 25
33 33 12 22 25 25
33 33 13 21 25 25
33 33 14 20 25 25
33 33 15 19 25 25
33 33 16 18 25 25
33 33 17 17 25 25
33 33 18 16 25 25
33 33 19 15 25 25
33 33 20 14 25 25
33 33 21 13 25 25
33 33 22 12 25 25
33 33 23 11 25 25
33 33 24 10 25 25
33 33 25 9 25 25
33 33 26 8 25 25
33 33 27 7 25 25
33 33 28 6 25 25
33 33 29 5 25 25
33 33 30 4 25 25
33 33 31 3 25 25
33 33 32 2 25 25
33 33 33 1 25 25
33 33 33 2 24 25
33 33 33 3 23 25
33 33 33 4 22 25
33 33 33 5 21 25
33 33 33 6 20 25
33 33 33 7 19 25
33 33 33 8 18 25
33 33 33 9 17 25
33 33 33 10 16 25
33 33 33 11 15 25
33 33 33 12 14 25
33 33 33 13 13 25
33 33 33 14 12 25
33 33 33 15 11 25
33 33 33 16 10 25
33 33 33 17 9 25
33 33 33 18 8 25
33 33 33 19 7 25
33 33 33 20 6 25
33 33 33 21 5 25
33 33 33 22 4 25
33 33 33 23 3 25
33 33 33 24 2 25
33 33 33 25 1 25
33 33 33 25 2 24
33 33 33 25 3 23
33 33 33 25 4 22
33 33 33 25 5 21
33 33 33 25 6 20
33 33 33 25 7 19
33 33 33 25 8 18
33 33 33 25 9 17
33 33 33 25 10 16
33 33 33 25 11 15
33 33 33 25 12 14
33 33 33 25 13 13
33 33 33 25 14 12
33 33 33 25 15 11
33 33 33 25 16 10
33 33 33 25 17 9
33 33 33 25 18 8
33 33 33 25 19 7
33 33 33 25 20 6
33 33 33 25 21 5
33 33 33 25 22 4
33 33 33 25 23 3
33 33 33 25 24 2
33 33 33 25 25 1

17,747

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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