问题(阿里2010年实习):

给定一个数t,以及n个整数,在这n个整数中找到相加之和为t的所有组合,例如t = 4,n = 6,这6个数为[4, 3, 2, 2, 1, 1],这样输出就有4个不同的组合,它们的相加之和为4:4, 3+1, 2+2, and 2+1+1。请设计一个高效算法实现这个需求。

下面,给出一种解法:

代码

#include <stdio.h>

#define  LEN 20

int path[LEN];
int arr[LEN] = {1, 1, 1, 2, 2, 3, 4, 4, 5, 5, 5, 8, 8, 8, 10, 10, 10, 12, 12, 12};

void clearpath()
{
    int i;
    for (i = 0; i < LEN; i++)
    {
        path[i] = 0;
    }
}
void out_put()
{
    int i;
    for (i = LEN-1; i >= 0; i--)
    {
        if(path[i] == 1)
            printf(" %d ", arr[i]);
    }
    printf("\n");
}

/*算法:
**q(n, t)表示从arr[0]...arr[n]中选出和为t的子集,则
**q(n, t) = q(n-1, t-arr[n]) + q(n-1, t)
*/
void q(int n, int t, int flag)
{
     if(t < 0)
         return;

path[n+1] = flag;

if(n == 0)
    {
        if(t == 0)
        {
            path[n] = 0; //不包含arr[0]
            out_put();
        }
        else if(arr[n] == t)
        {
            path[n] = 1;//包含arr[0]
            out_put();
        }
    }
    else
    {
        q(n-1, t-arr[n], 1); //包含arr[n]
        q(n-1, t, 0); //不包含arr[n]
    }
}

void subsum(int len, int t)
{
    q(len - 1, t - arr[len], 1);
    q(len - 1, t, 0);
}
int main()
{
    int t = 20;
    clearpath();
    subsum(LEN - 1, t);
    return 0;
}

该算法的时间复杂度为指数级(但实际情况应该好很多,与t相关),而且最大的问题在于,无法去掉重复的组合。求更好的解法。

转载于:https://www.cnblogs.com/hustcat/archive/2010/05/14/1735774.html

一道算法题,求更好的解法相关推荐

  1. 一道算法题跟大家分享

    无意中看到一道算法题,拿出我的解法与大家分享. 题目:输出1,2,3,4四个数字能组成的互不相同且无重复的三位数并统计满足条件的三位数个数 大家先想想,再看答案吧. View Code 1 /// & ...

  2. 每天一道算法题系列十二之整数转罗马数字

    每天一道算法题系列: 来源:力扣(LeetCode) 本题链接:https://leetcode-cn.com/problems/integer-to-roman/ 来源是力扣,大家喜欢可以去力扣中文 ...

  3. 截止目前为止,我遇到的最难的一道算法题:计算相邻两个数的最大差值

    hello,今天给大家带来一道算法题.这道算法题,是我目前为止,见过最难的一道题.那么到底是怎样的一道算法题呢?如下: 题目:给定一个数组, 求如果排序之后, 相邻两数的最大差值. 要求时间复杂度O( ...

  4. 一天一道算法题--5.30---递归

    感谢微信平台:  一天一道算法题 --------每天多一点进步--------- 今天 休假 这题 也很水 能发现 规律就好 明天 再也不能这样了 forgive me ---------- 转载于 ...

  5. 一天一道算法题--6.15--卡特兰数

    感谢微信平台---一天一道算法题---每天多一点进步- problem: 12个高矮不同的人 排成两排 每排必须是从矮到高排列 而且第二行比对应的第一排的人高 问排列方式有多少种? analyse: ...

  6. 每天一道算法题系列十七之电话号码的字母组合

    每天一道算法题系列: 来源:力扣(LeetCode) 本题链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-numb ...

  7. 搜狗2020秋招笔试的一道算法题

    搜狗2020秋招的一道算法题 有A,B,C三种样品,凑齐三个样品各一个就可以领取一个奖品.任意两个样品可兑换另一种样品,如AA可兑换一个B或一个C,AB可兑换一个C.输入ABC,问最多可以领取多少奖品 ...

  8. 怎么判断一个字符串的最长回文子串是否在头尾_每日一道算法题,让你的头脑更活跃(寻找最长回文子串)...

    前言 最近准备把算法慢慢的捡起来,所以准备日更一道算法题目,难度自然是由简入难,所以同学们可以每天都来看看小编的更新. 日更时间定在每晚20:00,希望大家多多关注啦. 昨天就欠更了,简直就是打脸.过 ...

  9. Homebrew作者面试Google被拒,只因写不出一道算法题

    相信很多人听说过关于Max Howell(Homebrew的作者)的故事: Max Howell在Google面试,但Google拒绝了他,给出的答复是:"虽然我们90%的工程师都用你写的软 ...

最新文章

  1. poj 2923(状态压缩dp)
  2. thunderbird怎样方便的导入gmail联系人
  3. javaweb----DAO模型设计
  4. java如何查看调用记录_查看Java记录
  5. 微型计算机突然断电什么信息全部都是,微型计算机的硬件组成阶段作业(函授2014春).doc...
  6. tail,more查看日志(定点和翻页)
  7. numpy 常用api(四)
  8. hdfs居然无法正常停止
  9. icinga+cacti整合
  10. CAD中插入外部参照字体会变繁体_CAD发给客户没字体怎么办?快速打包外部参照、字体、打印样式...
  11. Echarts图表之南丁格尔图
  12. 深入理解java8,深入理解Java8新特性与源码剖析
  13. 手机文件夹为什么是英文?哪些可以删除?看完清理能多出10G内存
  14. opencv读取超大像素图片
  15. OneNote PC端同步时遇到0×80004005
  16. echarts节点折叠实现
  17. 计算机映像缺失磁盘如何修复,重装Win10系统找不到硬盘的解决方法
  18. android如何app主题更换,通过EventBus更换android app主题
  19. 数据库单个插入操作转为批量插入
  20. mysql的dual_mysql中dual是什么意思

热门文章

  1. 深入理解阿里分布式消息中间件
  2. Windows 10 Visual Studio 2017 安装配置 Apache Thrift (C++)
  3. Homework_4 四则运算 - C#版
  4. 微软云计算 Windows Azure“腾云驾雾”
  5. RedHat的yum源修改为CentOS的yum源
  6. iterator与iterable
  7. [转载] C#面向对象设计模式纵横谈——12. Flyweight享元模式
  8. javascript:面向对象编程基础:多态
  9. 应用中验证码的生成方法.
  10. Ext4文件系统架构分析(一)