一道编程题求解:张三有一个神奇的仪器, 可以用任意原子合成新的分子

weixin_43982915 2020-10-23 06:54:02
张三有一个神奇的仪器, 可以用任意原子合成新的分子
现在一共有10种可供选择的原子. 每个原子必须使用1,2,3次
原子的总个数规定为n个, 张三想知道一共能合成多少种不同的分子
输入: 整数n, 表示新分子的原子总个数
(10<=n<=30), 表示新分子的原子总数.
输出: 第一行一个整数m, 表示不同的方案数
截下来m行, 每行一种方案, 包含10个整数, 表示每种原子的个数
样例输入:
29
样例输出:
10
2 3 3 3 3 3 3 3 3 3
3 2 3 3 3 3 3 3 3 3
3 3 2 3 3 3 3 3 3 3
3 3 3 2 3 3 3 3 3 3
3 3 3 3 2 3 3 3 3 3
3 3 3 3 3 2 3 3 3 3
3 3 3 3 3 3 2 3 3 3
3 3 3 3 3 3 3 2 3 3
3 3 3 3 3 3 3 3 2 3
3 3 3 3 3 3 3 3 3 2
...全文
1911 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_43982915 2020-10-23
  • 打赏
  • 举报
回复
感谢大佬!!!!
qybao 2020-10-23
  • 打赏
  • 举报
回复
排列组合的问题,用模拟进制的方法即可
比如,以下从右向左,满2进位
111
112
121
122
211
212
221
222
看到规律的吗?就像二进制01进位一样,001,010,011,100,101,110,111
这样,找出每种组合的总个数满足原子组合的总个数即可,比如原子总个数是5,那就只有122=1+2+2=5,212=2+1+2=5,221=2+2+1=5,3种符合
public class Sample {
public static void main(String[] args) {
try {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int elem[] = new int[10]; //每种原子的个数
Arrays.fill(elem, 1);
int max = n/10 + 1;
List<String> result = new ArrayList<>();
while(elem[0]<=max) {
int sum = 0;
for(int i=0; i<10; i++) sum += elem[i]; //原子总个数
if (sum==n) { //原子总个数和n相等则保存结果
result.add(Arrays.toString(elem).replaceAll("[\\[\\],]", ""));
}
elem[9]++; //原子总个数变化
for(int i=9; i>0; i--) {
if (elem[i]>max) {
elem[i-1]++;
elem[i] = 1;
}
}
}
System.out.println(result.size());
for (String s : result) {
System.out.println(s);
}

} catch (Throwable e) {
e.printStackTrace();
}
}
}

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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