问题标题: 1519 组合问题

2
0

1
已采纳
陆麟瑞
陆麟瑞
资深天翼
资深天翼
用搜索与回溯来做组合,从n个不同的元素中,任取m(m≤n)个元素为一组,叫作从n个不同元素中取出m个元素的一个组合。我们把有关求组合的个数的问题叫作组合问题。
void search(int t)
{
    int i;
    if(t>r) {
        total++;
        return;
    }
    for(int i=1; i<=n; i++){
        if(!b[i]&&i>a[t-1]||t==1)
{
            a[t]=i;
            b[i]=true;
            search(t+1);
            a[t]=0;
            b[i]=false; 
        }
    } 
}
1
叶卓舒
叶卓舒
初级守护
初级守护

组合数就是从1到n个数中抽取k个数(不重复)组合起来(从小到大),问一共有多少种组合放法,

如n=3,k=2:

  1,2

  1,3

  2,3

这3种。

这题是搜索回溯。

用过程写:

   递归边界:

     如果当前已经选好了k个数,则放法数加1,退出当前过程。

 

   选定每个一个数的条件是:

     (1):当前数小于前一个数。

     (2):当前数没有被用过。

 

0
夏子健
夏子健
初级光能
初级光能

 while(i!=0)
    {
        s=s*n;
        n--;
        i--;
    }
    j=r;
    while(j!=0)
    {
        k=k*r;
        j--;
        r--;
    }
    cout<<s/k;//这题不用搜索与回溯也行吧,谢**你跟踪执行这个程序就行了。
 

0
夏子健
夏子健
初级光能
初级光能

没错,必须都是long long ,不然不能满分!

0
郑怡翔
郑怡翔
初级天翼
初级天翼

只要按照一个公式来写程序就可以了:

结果=m*(m-1)*(m-2)......*(m-n+1)

前面是定义,输入

for(i=m-n+1;i<=m;i++)
    {
        nde*=i;
    }
    for(i=1;i<=n;i++)
    {
        mde*=i;
    }

最后输出:cout<<nde/mde;

不要忘了所有变量都必须是long long类型,不然不是100分哦!

0
0
0
崔子周
崔子周
高级天翼
高级天翼

111111111111111111111111111111

0
我要回答