careercup-递归和动态规划 9.8
9.8 给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码就是n分有几种表示法。
解法:
使用回溯法进行解决,实际上就是一个类似枚举的过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。
C++实现代码:
#include<vector>
#include<iostream>
using namespace std; void helper(vector<int> &denom,int target,vector<int> &path,vector<vector<int> > &res)
{
if(target<)
return;
if(target==)
{
res.push_back(path);
return;
}
int i;
for(i=;i<(int)denom.size();i++)
{
path.push_back(denom[i]);
helper(denom,target-denom[i],path,res);
path.pop_back();
}
} vector<vector<int> > makeChange(vector<int> &denom,int target)
{
if(denom.empty())
return vector<vector<int> >();
vector<vector<int> > res;
vector<int> path;
helper(denom,target,path,res);
return res;
} int main()
{
vector<int> vec={,,};
vector<vector<int> > res=makeChange(vec,);
for(auto a:res)
{
for(auto t:a)
cout<<t<<" ";
cout<<endl;
}
}
运行结果:

其中存在重复的,譬如:1 1 2 1 和 2 1 1 1。虽然顺序不一样,但是表示的同样的划分。
这是错误的,问题出在哪呢?有序和无序的区别!这个函数计算出来的组合是有序的,也就是它会认为1,2和2,1是不一样的,导致计算出的组合里有大量是重复的。那要怎么避免这个问题呢?1,5和5,1虽然会被视为不一样,但如果它们是排好序的,比如都按从大到小排序,那么就是5,1了,这时就不会重复累计组合数量。可是我们总不能求出答案之后在排序吧,多费劲。这是我们就在递归上动手脚,让它在计算的过程中就按照从大到小的币值来组合。比如,现在我拿了一个25分的硬币,那下一次可以去的币值就是25,10,5,1;如果我拿了一个10分的,下一次可以取的币值就只有10,5,1了;这样一来,就能保证,我只累计了一次,改造后的代码如下:
#include<vector>
#include<iostream>
using namespace std; void helper(vector<int> &denom,int start,int target,vector<int> &path,vector<vector<int> > &res)
{
if(target<)
return;
if(target==)
{
res.push_back(path);
return;
}
int i;
for(i=start;i<(int)denom.size();i++)
{
path.push_back(denom[i]);
//只能从下标i和i之后的元素开始取
helper(denom,i,target-denom[i],path,res);
path.pop_back();
}
} vector<vector<int> > makeChange(vector<int> &denom,int target)
{
if(denom.empty())
return vector<vector<int> >();
vector<vector<int> > res;
vector<int> path;
helper(denom,,target,path,res);
return res;
} int main()
{
vector<int> vec={,,};
vector<vector<int> > res=makeChange(vec,);
for(auto a:res)
{
for(auto t:a)
cout<<t<<" ";
cout<<endl;
}
}
运行结果:
[root@localhost 桌面]# ./coin

#include<iostream>
using namespace std; int makeChange(int n,int denom)
{
int next_denom=;
switch(denom)
{
case :
next_denom=;
break;
case :
next_denom=;
break;
case :
next_denom=;
break;
case :
return ;
}
int i;
int way=;
for(i=;n-i*denom>=;i++)
{
way+=makeChange(n-i*denom,next_denom);
}
return way;
} int main()
{
cout<<makeChange(,)<<endl;
}
careercup-递归和动态规划 9.8的更多相关文章
- 70. Climbing Stairs【leetcode】递归,动态规划,java,算法
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- 算法 递归 迭代 动态规划 斐波那契数列 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- C#递归、动态规划计算斐波那契数列
//递归 public static long recurFib(int num) { if (num < 2) ...
- 面试题目——《CC150》递归与动态规划
面试题9.1:有个小孩正在上楼梯,楼梯有n个台阶,小孩一次可以上1阶.2阶或者3阶.实现一个方法,计算小孩有多少种上楼梯的方式. 思路:第4个数是前三个数之和 注意:能不能使用递归,能不能建立一个很大 ...
- python---通过递归和动态规划策略解决找零钱问题
也是常见套路. # coding = utf-8 def rec_mc(coin_value_list, change, know_results): min_coins = change if ch ...
- Idea 02.暴力递归与动态规划(1)
1,关键词解释 1.1 暴力递归: 1, 把问题转化为规模缩小了的同类问题的子问题 2, 有明确的不需要继续进行递归的条件(base case) 3, 有当得到了子问题的结果之后的决策过程 4, 不记 ...
- scramble-string——两个字符串经过树化并旋转后是否一致、递归、动态规划
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- OptimalSolution(1)--递归和动态规划(1)斐波那契系列问题的递归和动态规划
一.斐波那契数列 斐波那契数列就是:当n=0时,F(n)=0:当n=1时,F(n)=1:当n>1时,F(n) = F(n-1)+F(n-2). 根据斐波那契数列的定义,斐波那契数列为(从n=1开 ...
- 递归,动态规划,找最短路径,Help Jimmy
题目链接:http://poj.org/problem?id=1661 解题报告: 1.老鼠每次来到一块木板上都只有两条路可以走,可以使用递归 #include <stdio.h> #in ...
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目10
2014-03-20 04:15 题目:你有n个盒子,用这n个盒子堆成一个塔,要求下面的盒子必须在长宽高上都严格大于上面的.如果你不能旋转盒子变换长宽高,这座塔最高能堆多高? 解法:首先将n个盒子按照 ...
随机推荐
- ANDROID_MARS学习笔记_S01原始版_007_Handler及线程的简单使用
一.运行结果 一.代码1.xml(1)activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.c ...
- CDC 虚拟com口
现在很多电脑已经不带232了,特别是手提电脑.这使很多使用手提在外调试人员非常不方便.或许你可以买一条市面上usb转232转换线,但这些线抗干扰不是太好,在一些干扰大的地方会发生连接中断的问题,所以往 ...
- Delphi GDI+ Library
GDI+ LibraryThis library enables GDI+ functionality for Delphi 2009 and later. It differs from other ...
- 二维图形的矩阵变换(二)——WPF中的矩阵变换基础
原文:二维图形的矩阵变换(二)--WPF中的矩阵变换基础 在前文二维图形的矩阵变换(一)——基本概念中已经介绍过二维图像矩阵变换的一些基础知识,本文中主要介绍一下如何在WPF中进行矩阵变换. Matr ...
- Vue.js 基础示例
为 Vue.js 初学者写了一些简单的示例,在线示例 示例源码 了解更多请查看 Vue.js 官网文档:http://vuejs.org.cn/guide/
- 11个强大的Visual Studio调试小技巧(转)
简介 调试是软件开发周期中很重要的一部分.它具有挑战性,同时也很让人疑惑和烦恼.总的来说,对于稍大一点的程序,调试是不可避免的.最近几年,调试工具的发展让很多调试任务变的越来越简单和省时. 这篇文章总 ...
- poj1160Post Office(DP)
http://poj.org/problem?id=1160 算水过的吧 四重循环没优化 CZ说爆可过 就爆了 dp[i][j] = min(dp[i][j],dp[i-1][g]-s) 第i个点建在 ...
- NoClassDefFoundError: javassist/util/proxy/MethodFilter
Caused by: java.lang.NoClassDefFoundError: javassist/util/proxy/MethodFilter at org.hibernate.byt ...
- CodeForces 287B Pipeline
思路:二分答案,时间复杂度O(nlgn). 若个数为x,那么算出这种情况下提供的水管的最大值和最小值与n比较即可,注意x个分离器需要减去x-1个水管. #include<cstdio> # ...
- 基于Geoserver配置多图层地图以及利用uDig来进行样式配置
在GeoServer中配置多个图层的地图相对来说很容易,其步骤为: 1. 进入geoserver 2. 配置相关的FeatureTypes 3. 配置WMS内容,进入以后,主要有以下几个地方需要命名: ...