部分和问题(贪心算法--递归)

#include<stdio.h>

#define N 20

int a[N];

int n,k;

int dfs(int i, int sum);

int main() {

int i;

scanf("%d%d", &n,&k);

for(i=0; i<n; i++){

scanf("%d", &a[i]);

}

if(dfs(0, 0))  {

printf("Yes\n");

// printf("");

}

else

printf("No\n");

return 0;

}// 已经从前i项得到了和sum,然后对于i项之后的进行分支

int dfs(int i, int sum) {

// 如果前n项都计算过了,则返回sum是否与k相等

if(i==n)   return sum==k;  // 不加上a[i]的情况

if(dfs(i+1, sum))

return 1; // 加上a[i]的情况

if(dfs(i+1, sum+a[i]))

return 1;  // 无论是否加上a[i]都不能凑成k就返回false

return 0;

}

时间: 2024-11-10 14:45:43

部分和问题(贪心算法--递归)的相关文章

算法导论——lec 13 贪心算法与图上算法

之前我们介绍了用动态规划的方法来解决一些最优化的问题.但对于有些最优化问题来说,用动态规划就是"高射炮打蚊子",采用一些更加简单有效的方法就可以解决.贪心算法就是其中之一.贪心算法是使所做的选择看起来是当前最佳的,期望通过所做的局部最优选择来产生一个全局最优解. 一. 活动选择问题 [问题]对几个互相竞争的活动进行调度:活动集合S = {a1, a2, ..., an},它们都要求以独占的方式使用某一公共资源(如教室),每个活动ai有一个开始时间si和结束时间fi ,且0 ≤ si &

【算法导论】贪心算法之活动选择问题

动态规划总是在追求全局最优的解,但是有时候,这样有点费时.贪心算法,在求解过程中,并不追求全局最优解,而是追求每一步的最优,所以贪心算法也不保证一定能够获得全局最优解,但是贪心算法在很多问题却额可以求得最优解. 一.问题概述 活动选择问题: 假定一个有n个活动(activity)的集合S={a1,a2,....,an},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用.每个活动ai都有一个开始时间si和一个结束时间fi,其中0<=si<fi<正无穷.如

贪心算法之活动分配问题

贪心算法之活动分配问题 在此之前,我们还讨论过贪心算法的活动选择问题,活动选择问题里面的选择策略在这篇文章里面作为贪心选择策略用到.好吧,让我们进入主题. 问题描述 有一个活动集合S={a1,a2,a3,...an},每一个活动ai都有一个开始时间si和结束时间fi,那么活动ai占用的时间段为[si,fi).如果活动ai和aj的时间段没有交集重叠,那么这两个活动是兼容的,即满足si≤fj或者fi≥sj,[ai,aj]就是兼容的.现在我们需要为这些活动安排教室,保证活动之间各不冲突.请问怎么安排才

分治法、动态规划、回溯法、分支界限法、贪心算法

转:http://blog.csdn.net/lcj_cjfykx/article/details/41691787 分治算法一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时

贪心算法入门

今天看了一下贪心算法,贪心算法没有具体的算法框架.贪心算法主要找当前看来最好的解,没有考虑整体最优.得到的只是局部最优解. 贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关. 所以对所采用的贪心策略一定要仔细分析其是否满足无后效性. 二.贪心算法的基本思路: 1.建立数学模型来描述问题. 2.把求解的问题分成若干个子问题. 3.对每一子问题求解,得到子问题的局部最优解. 4.把子问题的解局部最优解合成原来解问题的一

分治法、动态规划、贪心算法区别

1.分治法 算法思想:将原问题划分成若干个规模较小而结构与原问题相似的子问题,递归的解决这些子问题,然后再合其结果,就得到原问题的解 特征: 该问题的规模缩小到一定的程度就很容易解决 该问题可以分解为若干个规模较小的相同问题,即改问题具有最优子结构性质 利用该问题分解出的子问题的解可以合并为该问题的解: 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题 2.动态规划 算法思想:与分治法相似,也是通过组合子问题的解而解决整个问题.区别是,动态规划适用于分解得到的子问题往往不是

从 活动选择问题 看动态规划和贪心算法的区别与联系

这篇文章主要用来记录我对<算法导论> 贪心算法一章中的“活动选择问题”的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题---粗略提下,详细请参考<算法导论> ②活动选择问题的DP(Dynamic programming)求解--DP求解问题的思路 ③活动选择问题的贪心算法求解 ④为什么这个问题可以用贪心算法求解? ⑤动态规划与贪心算法的一些区别与联系 ⑥活动选择问题的DP求解的JAVA语言实现以及时间复杂度分析 ⑦活动选择问题的Gr

活动选择问题(贪心算法vs动态规划)

活动选择问题贪心算法vs动态规划 基础知识 1-1动态规划 1-2贪心算法 1-3贪心算法vs动态规划 活动选择问题描述 活动选择问题最优子结构 活动选择问题算法设计 4-1贪心算法之选择最早结束活动 4-1-1递归贪心算法 4-1-2迭代的方式进行 4-2贪心算法之选择最短时长活动 4-3动态规划方法实现 4-3-1自上而下的实现 4-3-2自下而上的实现 结论 活动选择问题(贪心算法vs动态规划) 1.基础知识 在讲解活动选择问题之前,我们首先来介绍一动态规划和贪心算法的基础知识 1-1.动

JAVA算法基础-贪心算法

前言 学无止境.算法博大精深啊,一个贪心算法里面就隐含了这么多不同的场景实现,每个场景下的算法就有多种不同的实现,个人写法不一也成就了各种不同的漂亮算法,看了这些实现,也让我开拓了思维,这个世界的方案永远没有最完美的只有最合适的- ! 1.贪心算法概念 贪心算法也叫贪婪算法,当然叫法随意.主要目的是在问题求解时,做出最正确的判断= =,这不是贪心是啥?在计算机工程领域当中,就是说不考虑整体最优算法而是从局部做到最优解.当然贪心是算法不能对所有的问题都能得到整体都最优解,但对多数个问题还是能得到近