在n个数中找到和为t的所有组合,阿里笔试题目

原题连接

http://wenku.baidu.com/view/3db1ebd4195f312b3169a5aa.html 

 

解法参考链接

http://blog.csdn.net/microsues/article/details/6603414

 

我的C语言实现

/*
在n个数中找到和为t的所有组合,设计一个高效算法
http://wenku.baidu.com/view/3db1ebd4195f312b3169a5aa.html
*/
#include <stdio.h>
#include <stdlib.h>
#define N 80

int numArray[N] = {3,4,1,2,2,1};
int isTravelled[N] = {0};
int n = 0;
int t = 0;

int find_pos_and_restSum(const int pos,const int restSum)
{
    //pos是剩下的数中的第一个,pos最大是n-1
    //pos=n时说明没有数了,如果0!=restSum,说明不存在
    if(pos>n) //等价于  if(pos==n && 0!=restSum)
        return 1;
    if(0==restSum)
    {
        int i;
        for(i=0;i<n;i++)
        {
            if(isTravelled[i]==1)
              printf("%d ",numArray[i]);
        }
        printf("\n");
        return 0;
    }
    //restSum!=0时
    int j;
    for(j=pos;j<n;j++)
    {
        //确保新的restSum>=0
        if(numArray[j]>restSum)
            continue;

        isTravelled[j] = 1;
        find_pos_and_restSum(j+1,restSum-numArray[j]);/*错误1:将j+1写成pos+1*/
        isTravelled[j] = 0;
        while(j<n-1 && numArray[j]==numArray[j+1])/*错误2:将n-1写成pos-1*/
            j++;
    }
    if(numArray[j-1]>restSum)
        return 2;
    else
        return 0;
}

int cmp(const void * a,const void * b)
{
    return *((int *)b)-*((int *)a);
}

int main()
{
    t = 4;//sum
    n = 6;//length of numArray

    //排序
    qsort(numArray,n,sizeof(int),cmp);
    //回溯
    int result = find_pos_and_restSum(0,t);
    if(1==result)
        printf("1 no compared number group.\n");
    else if(2==result)
        printf("2 no compared number group.\n");

    return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值