求一个高效的组合算法

kevinjean 2011-06-28 10:42:04
有13个口袋,编号从1-13,每个口袋里只能放红,黄,蓝三个球中的任意个(0-3个),每个口袋里放的球不可重复,如两个红球之类的,但不同口袋里可重复,如1号袋中放红,3号中放红黄等。现在求一个算法,举例说,在13个口袋中选了6个口袋中放球,也它口袋未放球,这6个口袋中有放一个的,有放两个的,有放3个的,从每个口袋中拿出一个球,拿出X个红球的所有组合,求这个算法,最好高效的。
哎,分数不够,发不到技术区
...全文
92 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
kevinjean 2011-07-18
  • 打赏
  • 举报
回复
你这不是插入源代码了吗
nanyou521 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhao4zhong1 的回复:]

仅供参考C/C++ code
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int m;//记录字符串长度
int n;//记录字符串中的字符种类数
char map[256];//记录是哪几种字符
int count[256];//记录每种字符有多少个
int stack[1000];//递归用的栈,并记录当前生成的排列……
[/Quote]
你回复的时候怎么插入源代码的啊?
我怎么不能插入源代码呢,我是指带代码框的
kevinjean 2011-07-04
  • 打赏
  • 举报
回复
要没有好的方法要结贴了。
kevinjean 2011-06-30
  • 打赏
  • 举报
回复
实在是不好处理,有高手给有办法没?
kevinjean 2011-06-29
  • 打赏
  • 举报
回复
谢了,我看了,你这个是排列组合的,我说的那个比这个还难一点,就是每个组合的情况还要再跟一个不确定的数字相乘,比如从这6个口袋中的3个口袋中拿出3个红球的情况,还要乘剩下3个口袋的除了红球外的所有情况,那再挑另外3个口袋的红球,要乘的数字又不同了。
赵4老师 2011-06-28
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int m;//记录字符串长度
int n;//记录字符串中的字符种类数
char map[256];//记录是哪几种字符
int count[256];//记录每种字符有多少个
int stack[1000];//递归用的栈,并记录当前生成的排列
void Make_Map(char *str) {//统计字符串的相关信息
int s[256];
int i;
memset(s,0,sizeof(s));
memset(count,0,sizeof(count));
m=strlen(str);
while(*str) {
s[*str]++;
str++;
}
n=0;
for (i=0;i<256;i++)
if (s[i]) {
map[n]=i;
count[n]=s[i];
n++;
}
}
void Find(int depth) {//递归式回溯法生成全排列
if (depth==m) {
int i;
for (i=0;i<depth;i++) putchar(map[stack[i]]);
putchar('\n');
} else {
int i;
for (i=0;i<n;i++)
if (count[i]) {
stack[depth]=i;
count[i]--;
Find(depth+1);
count[i]++;
}
}
}
void main(int argc,char**argv) {
if (argc<2) {
printf("%s 要产生全排列的字符串\n",argv[0]);
return;
}
Make_Map(argv[1]);
Find(0);
}
赵4老师 2011-06-28
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM 26
int comb[MAX_NUM];
int c1,c2;
void combination(int m, int n)
{
int i, j;
for (i = m; i >= n; i--){
comb[n] = i; /* 选择当前的“头”元素 */
if (n > 1){
/* 进入下一次更小的组合问题 */
combination(i - 1, n - 1);
}else{
/* 满了需要的组合数,输出 */
for (j = comb[0]; j > 0; j--){
printf("%c", 65+c1-comb[j]);
}
printf("\n");
}
}
return;
}
int main(int argc, char *argv[])
{
if (argc<3) {
printf("%s 组合下标 组合上标\n",argv[0]);
return 0;
}
c1=atoi(argv[1]);
if (c1<1||26<c1) {
printf("1<=组合下标<=26\n");
return 0;
}
c2=atoi(argv[2]);
if (c2<1||c1<c2) {
printf("1<=组合上标<=组合下标\n");
return 0;
}
comb[0]=c2;
combination(c1, c2); /* C(4, 2) */
return 0;
}
kevinjean 2011-06-28
  • 打赏
  • 举报
回复
没搞懂,好像能发到技术区。不知道怎么移到技术 区,

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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