社区
.NET Framework
帖子详情
给定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
...全文
576
2
打赏
收藏
给定33个数 从33个中选6个(可以重复) 加和等于150 统计有多少种排列方法 JAVA怎么编写啊?
给定33个数(1,2,3,4,5...33) 从33个中选6个(可以重复) 加和等于150 统计有多少种排列方法 JAVA怎么编写啊? 谁能解答一下 谢谢 原帖 http://topic.csdn.net/u/20091116/20/b8e6f325-d14f-4133-abbb-220180576f9f.html
复制链接
扫一扫
分享
转发到动态
举报
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
[转]两个
java
写的组合算法
在IT行业中,组合算法是一
种
常见的数据结构和算法问题,它主要涉及到如何从一个
给定
的元素集合
中选
择若干个元素,而这些元素的
排列
顺序并不重要。在这个场景中,我们有两个
Java
编写
的类,名为"choose.
java
"和"Comb....
蓝桥杯 python 组题目和解析.docx
- **题目描述**:
给定
一个 n*n 的矩阵,每个位置上有一个非负整数,表示从该位置出发到达目标位置的最小步数。请
编写
程序计算从矩阵左上角出发到达右下角的最小步数。 - **解析**: - **动态规划**: 这是一个典型的...
寻找接近
给定
和的若干
个数
有n个正整数,按从小到大的顺序升序
排列
,现
给定
一个实数m,请从数组中找出若干
个数
,满足这若干
个数
的和与m最为接近。
1. 从n
个数
中选
择m
个数
给定
两个整数 n 和 m,长度为n的数组 中所有可能的 k
个数
的组合。你可以按 任何顺序 返回答案。
从n
个数
中选
出m
个数
,结果按照字典序
排列
数的组合问题,从n
个数
中选
出m
个数
,结果按照字典序
排列
数的组合问题。从1,2,…,n中取出m
个数
,将所有组合按照字典顺序列出。如n=3,m=2时,输出:12 13 23 思想:每
个数
的选择都有可能,比如选择两
个数
,假设第一...
.NET Framework
17,747
社区成员
24,327
社区内容
发帖
与我相关
我的任务
.NET Framework
.NET技术 .NET Framework
复制链接
扫一扫
分享
社区描述
.NET技术 .NET Framework
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章