首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 求一算法 [已结贴,结贴人:yfenfang]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yfenfang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-02-22 20:55:48 楼主
      有N个数字,数字类型不限,以M个数字为一组,能组合多少种组合?请用 算法实现
    或用递归实现

    在线等,嫌分不够可以再加
    60  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • baihacker
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

    发表于:2008-02-22 21:06:041楼 得分:10
    C/C++ code
    #include <iostream> #include <stack> using namespace std; int total = 0; struct STATE { int curr; int min; int mark; STATE(int c = 0, int mi = 0, int ma = 0) : curr(c), min(mi), mark(ma){} }; void select(char* str, char* buff, int l, int n) { stack<STATE> stk; STATE t; buff[n] = 0; stk.push(STATE()); if (n == 0) { cout << endl; total++; return; } while (!stk.empty()) { t = stk.top(); stk.pop(); if (t.curr == n - 1) { for (int i = t.min; i < l; i++) { buff[t.curr] = str[i]; cout << buff << endl; total++; } } else if (t.mark == 0) { t.mark = 1; stk.push(t); buff[t.curr] = str[t.min]; stk.push(STATE(t.curr + 1, t.min + 1, 0)); } else { if (t.min + 1 < l) stk.push(STATE(t.curr, t.min + 1, 0)); } } } int main(void) { char str[]="abcdefg"; char buffer[32]; total = 0; select(str, buffer, strlen(str), 3); cout << total << endl; return 0; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • baihacker
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

    发表于:2008-02-22 21:10:192楼 得分:10
    C/C++ code
    #include <iostream> using namespace std; void comb(int l, int last, int m, int n, char* data) { if (l == n) { for (int i = 0; i < n; i++) cout<<data[i]; cout<<endl; return; } else { for (int i = last; i < m; i++) { data[l] = i + 'A'; comb(l + 1, i + 1, m, n, data); } } } int main() { int m, n; char data[32]; cout<<"input m n:"; cin>>m>>n; comb(0, 0, m, n, data); return 0; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yfenfang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-22 21:25:073楼 得分:0
    请问1楼,
    C/C++ code
    #include <iostream> using namespace std;


    不像是在同一个编译器的引用, using namespace 像是在VS.NET中的风格 和#include VC的风格,

    stack <STATE>    stk;
    我有点看不懂
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cangwu_lee
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

    发表于:2008-02-22 22:36:344楼 得分:7
    2樓方法簡單。見過同類的VB的代碼。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • icemine
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-02-22 23:09:195楼 得分:18
    又是排列组合,我给个递归形式的吧
    C/C++ code
    #include <stdio.h> #define MAX 20 void comb_origin( int a[], int b[], int n, int m, const int M, int *count) { int i,j; for(i = n; i>=m; i--) { b[m-1] = i - 1; if(m > 1) comb_origin(a, b, i-1, m-1, M, count); else { for(j = M-1; j>=0; j--) printf("%d ",a[b[j]]); printf("\n"); (*count)++; } } } int combine(int A[], int N, int M)//从A中N个元素中取M个 { int B[MAX]; static int Count = 0; comb_origin(A, B, N, M, M, &Count); return Count; } int main() { int set[9] = {1,2,3,4,5,6,7,8,9}; int c = combine(set,9,5); //从集合set中的9个元素里选5个元素的组合 printf("\n 共%d组 \n",c); system("PAUSE"); return 0; }

    如果单单计算组合数,按公式计算就可以了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dizuo
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

    发表于:2008-02-22 23:24:216楼 得分:15
    stack <STATE> stk; 和 using namespace std;
    主要是C++里面的做法,
    修改 删除 举报 引用 回复

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