首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 100分求和为某个数N的数据组合的问题 [已结贴,结贴人:wintergoes]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-24 14:46:20 楼主
    给一个数N,算出有多少种组合可以使组合的数加起来的和等于这个数,组合中的数字可以重复,但是排序是有顺序的,就是说不同的排序顺序也算一种组合
    例如:4有以下几种组合
    1 1 1 1
    1 1 2 0
    1 2 1 0
    1 3 0 0
    2 1 1 0
    2 2 0 0
    3 1 0 0
    4 0 0 0

    求如何用程序得到N个数时的这个数组
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-24 16:25:591楼 得分:20
    var
      i,j, k,g,s : integer;
    begin
      for i := 0 to 4 do
      begin
        for j := 0 to 4 do
        begin
          for k := 0 to 4 do
          begin
            for g := 0 to 4 do
            begin
              if (i+j+k+g) = 4 then
                Self.Memo1.Lines.Add(IntToStr(i)+IntToStr(j)+IntToStr(k)+IntToStr(g))
            end;
          end;
        end;
      end;
    end;
    0004
    0013
    0022
    0031
    0040
    0103
    0112
    0121
    0130
    0202
    0211
    0220
    0301
    0310
    0400
    1003
    1012
    1021
    1030
    1102
    1111
    1120
    1201
    1210
    1300
    2002
    2011
    2020
    2101
    2110
    2200
    3001
    3010
    3100
    4000
    这是运行结果
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-24 16:33:372楼 得分:0
    我要的是N个数的情况,不是某个具体数的算法。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-24 16:41:053楼 得分:20
    你的数的长度是多少。

    没限制长度没法做的,比如 4
    4
    40
    400
    4000
    40000
    400000....
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-24 16:50:404楼 得分:0
    哦,长度就是限制为N,比如4最长的情况是4个1,所以长度限制为4。

    对了,不是最长限制为4,是长度就是4,不如果比这个长度短的数组。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-24 16:51:525楼 得分:20
    是的,你得限制长度,
    限制了长度了,你把那个具体数改成变量传进去不就可以了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-24 20:45:316楼 得分:20
    num:=9
    len:=4
    //定义数组
    function get(n,l)
      for i:=0 to n do
      begin
        a(l) := i;
        if l==1 then
            begin
              sum:=0
              for j:=1 to len do
              begin
                  sum:=sum+a(j)             
              end;
                  if sum==n then
                    //添加
            end
        else
            get(n,l-1)
      end;
    end function

    get(num,l)
    好久不写对语法不熟了.
    就是用递归来实现,用一个全局的数组保存每层递归的一个录入数.
    1、在最深层判断当前len个数加起来,是否等于num等则输出,不等则不输出。判断完最深层退回一次。
    2、递进后再深入...
    3、重复1
    4、直到判断完
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-24 20:46:047楼 得分:20
    描述了一下算法希望对你有帮助。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved