社区
.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
...全文
637
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写文章
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
LeetCode 面试经典
150
题回顾
最经典
150
题,掌握面试所有知识点 面试经典
150
题 : 题目分析、解题思路、复杂度分析、代码展示
{ Cracking The Coding Interview:
150
programming Q&A } --- Arrays and Strings
Chap 8 Interview questions 1. Data structures 1.1 Arrays and strings Hashtable, ArrayList (Dynamically resizing array, providing O(1) access), StringBuffer (do string concatenation) 1.
【20250726】华为od面经-
java
后端
一面答得一般,二面答得一坨,虽然两次面试手撕代码都做出来了而且hr说手撕代码比较重要,但还是感觉已经凉了。
2026华为OD机试(
JAVA
&Go)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ
华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,
Java
实现。
2026华为OD面试手撕代码真题目录
一般面试的时候每一轮技术面都会出一到两个手撕代码题,这些题的特点就是,非常短小,易于理解。不可能会再出阅读理解一样的机试题的。但是这些题目也非常注意基本功,很注意细节的处理,一般都是easy+medium题目。但是大家一定要注意,因为大部分面试官上面一开始就会让你做题,直接看你所有的做题过程(防止有人水平一般,机试就网上找的答案的蒙混过关),手撕代码题会给你后面的面试定一个基调。
.NET Framework
17,748
社区成员
24,324
社区内容
发帖
与我相关
我的任务
.NET Framework
.NET技术 .NET Framework
复制链接
扫一扫
分享
社区描述
.NET技术 .NET Framework
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章