C++处理一个动态规划的问题
嗯哼,别人问的问题,看的我也头晕,百度了一下动态规划,看了看才想起来该怎么做,今天写了写代码,实现了~
要求是递归,动态规划,想了想这种方法也是最简单的~
所谓动态规划:把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解。动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。(摘自百科)(时间复杂度为一个多项式的复杂度)
背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。
题目如截图:
解题思路:
n代表面值
n为1,直接看是否可以整除;
n>1,看在没有第n个面值的时候多少,然后看有1个、2个....j/n个面值为n的时候需要几枚硬币,取最小值
将这些直接存在数组中,然后去数组里的最小值
代码:
1 #include"header_file.h" 2 using namespace std; 3 4 int coin_num(vector<int> T,int i,int j) 5 { 6 if(i==1) 7 { 8 if(j%T[0]==0) 9 { 10 return j/T[0]; 11 } 12 else 13 { 14 return 9999; 15 } 16 } 17 else 18 { 19 int min; 20 min=coin_num(T,i-1,j); 21 int temp; 22 temp=j/T[i-1]; 23 for(int m=0;m<=temp;m++) 24 { 25 if(min>(m+coin_num(T,i-1,j-m*T[i-1]))) 26 min=m+coin_num(T,i-1,j-m*T[i-1]); 27 28 } 29 return min; 30 } 31 } 32 33 vector<int> all_num(vector<int> T,int j) 34 { 35 vector<int> v; 36 for(int i=0;i<T.size();i++) 37 v.push_back(coin_num(T,i+1,j)); 38 // for(int i=0;i<T.size();i++) //use for test 39 // cout<<v[i]<<" "; 40 //v.push_back(coin_num(T,i+1,j)); 41 return v; 42 } 43 44 int find_min(vector<int> v) 45 { 46 int min=0; 47 for(int i=1;i<v.size();i++) 48 { 49 if(v[min]>v[i]) 50 min=i; 51 } 52 return v[min]; 53 } 54 55 int main(void) 56 { 57 int n; 58 cout<<"input n:"; 59 cin>>n; 60 61 vector<int> T; 62 for(int i=0;i<n;i++) 63 { 64 int temp; 65 cin>>temp; 66 T.push_back(temp); 67 } 68 69 int j; 70 cout<<"input j:"; 71 cin>>j; 72 73 vector<int> v; 74 v=all_num(T,j); 75 int min; 76 min=find_min(v); 77 cout<<"min:"<<min<<endl; 78 }
转载于:https://www.cnblogs.com/wswang/p/5112253.html
C++处理一个动态规划的问题相关推荐
- 很特别的一个动态规划入门教程
很特别的一个动态规划入门教程 今天在网上看到一个讲动态规划的文章,是以01背包为例的,这文章和书上的讲解非常不一样,令我眼前一亮,于是转载一下下--- (说明一下,本人非常痛恨教材公式定理漫天飞,实际 ...
- 运筹学动态规划逆序解法,对于一个动态规划问题,应用顺序解法或者逆序解法可能会得出不同的最优解。...
[单选题]欲为幻灯片中的文本创建超级链接,可用( )选项卡中的"超级链接"命令 . [单选题]一个人站在旋转平台的中央,两臂侧平举,整个系统以 w 0 = 2π rad/s 的角速 ...
- 有了四步解题法模板,再也不害怕动态规划!
来自公众号:五分钟学算法 导言 动态规划问题一直是算法面试当中的重点和难点,并且动态规划这种通过空间换取时间的算法思想在实际的工作中也会被频繁用到,这篇文章的目的主要是解释清楚 什么是动态规划,还有就 ...
- 动态规划(DP)通俗讲解
参考 徐凯强 Andy 动态规划中递推式的求解方法不是动态规划的本质. 我曾经作为省队成员参加过NOI,保送之后也给学校参加NOIP的同学多次讲过动态规划,我试着讲一下我理解的动态规划,争取深入浅出. ...
- 图像压缩算法动态规划c语言,图像压缩算法 动态规划
图片在计算机存储的是图片中的一个一个像素,也就是像素的灰度值.灰度值的范围是0~255.有灰白图像和彩色图像,它们每个像素的通道数量不同.灰白图像是单通道的,而彩色图像是3个通道的(BGR),也就是彩 ...
- mysql动态规划_动态规划《开篇》
动态规划(dynamic programing)和分治法类似,都是通过组合子问题的解来求解原问题的解.(在经典排序算法中的二路归并排序和快速排序都用到了分而治之的思想-分治法). 分治法是将原问题划分 ...
- 剑指Offer:剪绳子(动态规划、贪婪算法)
问题描述 给你一根长度为n的绳子,请把绳子剪成m段(m.n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],-,k[m].请问k[0]xk[1]x-xk[m]可能的最大乘 ...
- 活动选择的贪心算法与动态规划
问题: 有一个需要使用每个资源的n个活动组成的集合S= {a1,a2,···,an },资源每次只能由一个活动使用.每个活动a都有一个开始时间和结束时间,且 0<= s < f .一旦被选 ...
- LeetCode 97交错字符串(动态规划)
微信搜一搜:bigsai 大家都在关注的刷题.学习数据结构和算法宝藏项目 关注回复进群即可加入力扣打卡群,欢迎划水.近期打卡: LeetCode 92反转链表Ⅱ&93复制ip地址&94 ...
最新文章
- python语言中文社区-python的汉语
- java通过jdbc登陆系统_JDBC模拟登录
- BZOJ-3876-支线剧情-Ahoi2014-上下界网络流
- 认知无线电matlab代码详解,认知无线电频谱感知之功率检测matlab代码.docx
- JavaScript学习随记——数组一
- 视觉SLAM笔记(54) Ceres 操作后端优化
- tl r402路由器设置_记一次TP-LINK路由器问题排查
- 转list_quot;quot;转 Int,{} 转 List,还有什么奇葩的 JSON 要容错?| 实战
- 使用Adobe Fireworks CS6压图
- itchat 运行记录
- python图书管理实训报告总结_结对项目 —— 图书管理系统实验报告
- [LCT BZOJ]2959: 长跑
- mac备份文件到windows
- harmonyos2.0是什么,HarmonyOS 2.0 Beta是什么?HarmonyOS 2.0 简介
- linux里sub用法,awk中gsub和sub 的用法
- 年龄和收入对数的线性回归_金融计算收益率的时候为什么大部分用对数收益率 (Log Return) 而不是用算数收益率?...
- js字符串常见操作方法
- matlab图形编辑,Matlab图形与编辑
- 消息称华为深圳研发基地员工坠楼 官方称不知情
- 嵌入式有哪些发展方向?
热门文章
- World Token官网钱包收益是骗人的吗?是传销吗?
- [Redux/Mobx] Mobx的设计思想是什么
- [react] 你是如何划分React组件的?
- 重学java基础第二十五课:数据类型
- [css] CSS的伪类和伪对象有什么不同?
- [css] 说说sass有哪些你认为很棒的特性
- 工作301:substring使用
- 前端学习(2550):事件指令解析
- 前端学习(2061):vue的mvvm
- 前端学习(1855)vue之电商管理系统电商系统之安装mysql出现VCRUNTIME140_1.dll