例:n = 19

19个整数即:1-19

每个数字在 同一个算式中只能出现一次;

如:

1+19

1+2+17

1+2+3+14

1+2+3+4+10

.....

2010-11-17 06:54:17

10 Answers

我说个思路 你按着思路写就可以 我之前写过 但是不想贴源码
对你来说没多大意义
首先 你给的数字n 可以组成一个构成他的集合
{num属于自然数 并且小于n}(0在集合中不算自然数)
然后 找出全部2个相加等于n的
例如 n=19 19=1+18 19=2+17.....19=9+10 其实两个数相加等于19的就只有19/2个
由此可见 三个相加 的只有 19/3个
那么拆两位数其中一个分解下 就是三位数的
第一个18-1不可以 因为有1了已经 那么试试-2 就得到了19=1+16+2
然后一直到 你找到了6个三个数字构成的
然后继续找 四个的
如此即可
可以推算出最多几个数字可以构成n
那就是 从1开始加 sun=1+2+3....直到sun大于n 那么 sun有几个数相加的为size
size-1就是最多的 组合成n的 就不用继续循环了 

2010-11-17 09:06:17
public class Ab { public static void main(String args[]) { int sum = 0; int number=1; int sum2=0; for (number= 1; number <= 19; number++) {//number表示有几个不重复的数相加,从1一直循环到19 sum2=pan(number); sum+=sum2; System.out.println("数字1到19中 "+number+" 个不重复的数相加等于20 ---有方法 " + sum2 + "种"); } System.out.println("1到19任意个不重复的数相加等于20 共有方法 " + sum + " 种"); } private static int pan(int number){ int start=1;//start表示每次循环的开始数值 int sum=0;//记录所有满足要求的方法数 int n=1;//记录当前已是第几个重复的数 int midresult=0;//midresult记录每次循环所得的中间结果,以便下次循环参考 for (start= 1; start<19;start++) {//在不重复数字总个数为number情况下,初始数字从1到19变化 midresult =start; sum+= duan(start,midresult,number,n); } return sum; } private static int duan(int start,int midresult,int number,int n){ int sum=0; for (int j= start+1; j<=19;j++) { if(n+1<number&&midresult+j<20) sum+= duan(j,midresult+j,number,n+1);//运用了递归算法 else if(n+1==number&&j+midresult==20)sum++; } return sum; } }
2010-11-17 10:34:43
void FindCombination(int nSum, int nValue) { static list<int> listComb; if(nValue < 0 || nSum < 0) return; if (nSum > 0) { listComb.push_front(nValue); FindCombination(nSum-nValue, nValue-1); listComb.pop_front(); FindCombination(nSum, nValue-1); } else { cout << "组合:"; for(list<int>::iterator it = listComb.begin(); it != listComb.end(); ++it) cout << " " << *it; cout << endl; }
2010-11-17 11:38:33

这个题完全没这么复杂吧,每个数字在 同一个算式中只能出现一次,是个关键的限制,即
1,2,3 在一个组合里只有一个机会出现。计算所有有1出现的组合,在计算所有2出场,1没有出现的组合,以此递增计算累加和。
...
20=2+18;
20=2+3+15
20=2+3+4+11
20=2+3+4+5+6
...
20=3+17
20=3+4+13
20=3+4+5+8
...
20=8+12
20=9+11

下面是段C的代码,

#include <stdio.h> int getcount(int n,int start) { return ( (n<2*start) ? 0 : getcount(n-start,start+1)+1); } int getCounts(int n) { int Count=0; for(int i=1;i<(n+1)/2;++i) {//注意和和是n+1 //printf(" i=%d %d ",i,getcount(n,i)); Count+=getcount(n,i); } return Count; }

2010-11-17 13:47:20

for A1> A2 >A3 >A4 .....
有限序列 A1+A2+A3+A4+.....Ak=N

构造
A1=|N/2|+1:1; (是否满足左大于右,是 下一步,否,输出以上)
A2=N-A1:A1+1; (是否满足左大于右,是 下一步,否,输出以上)
A3=N-A1-A2:A2+1;(是否满足左大于右,是 下一步,否,输出以上)
A4=N-A1-A2:A3+1;(是否满足左大于右,是 下一步,否,输出以上)
..........
又有先取最大

11-9
10-9-1
9-8-3
9-8-2-1
8-7-5
8-7-4-1
8-7-3-2
。。。。

6-5-4-3-2

2010-11-17 15:27:26

这是一道比较简单的母函数题
用多项式:
(1+x)(1+x^2)(1+x^3).....(1+x^19)
展开后
x^20项前面的系数就是我们想要的结果
具体可以看一下我的这篇博客,有相关的代码实现

2010-11-17 16:43:15
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制