算法导论三剑客之 动态规划 0-1背包问题

 1 #include "iostream"
 2 using namespace std;
 3
 4 float MAX(float m1,float m2){
 5     if(m1>=m2)
 6         return m1;
 7     else
 8         return m2;
 9 }
10
11 float bag_Zero_One(int n,float v,float p[],float w[]){
12     if(n==0||v==0)
13         return 0;
14     else{
15         float m2;
16
17         m2=bag_Zero_One(n-1,v,p,w);
18         if(v>=w[n]){
19             float m1;
20             m1=bag_Zero_One(n-1,v-w[n],p,w)+p[n];
21             m2=MAX(m1,m2);
22         }
23         return m2;
24     }
25 }
26
27 void main(){
28     float p[]={0,10,3,2};
29     float w[]={0,5,6,7};
30     float v=12;
31     cout<<"Result:"<<bag_Zero_One(3,v,p,w)<<endl;
32     getchar();
33 }

算法导论三剑客之 动态规划 0-1背包问题,布布扣,bubuko.com

时间: 2024-12-25 11:37:32

算法导论三剑客之 动态规划 0-1背包问题的相关文章

算法导论三剑客之 分治算法 合并排序

1 #include "iostream" 2 #include "windows.h" 3 #define MAX 0x7fffffff 4 using namespace std; 5 6 void merge(int s,int q,int e,int A[]){ 7 int i,j,k; 8 int B[100],C[100]; 9 for(i=s;i<=q;i++) 10 B[i-s+1]=A[i]; 11 for(j=q+1;j<=e;j++

算法导论——lec 11 动态规划及应用

和分治法一样,动态规划也是通过组合子问题的解而解决整个问题的.分治法是指将问题划分为一个一个独立的子问题,递归地求解各个子问题然后合并子问题的解而得到原问题的解.与此不同,动态规划适用于子问题不是相互独立的情况,即各个子问题包含公共的子子问题.在这种情况下,如果用分治法会多做许多不必要的工作,重复求解相同的子子问题.而动态规划将每个子问题的解求解的结果放在一张表中,避免了重复求解. 一. 动态规划介绍 1. 动态规划方法介绍: 动态规划主要应用于最优化问题, 而这些问题通常有很多可行解,而我们希

【算法导论】用动态规划解活动选择问题

上一篇讲了贪心算法来解活动选择问题([算法导论]贪心算法之活动选择问题),发现后面有一道练习16.1-1是要用动态规划来解活动选择问题.其实跟之前的矩阵链乘法有些相似,也是考虑分割的活动是哪一个,并用二维数据来记录Sij---最大兼容集合个数,和用另一个二维数据来记录Sij取得最大时的活动分割点k.然后就是考虑边界问题,和使用递归来求动态规划的最优解. 代码注解比较详尽: #include <iostream> #include <algorithm> using namespac

《算法导论》中动态规划求解钢条切割问题

动态规划算法概述 动态规划(dynamic programming)1是一种与分治方法很像的方法,都是通过组合子问题的解来求解原问题.不同之处在于,动态规划用于子问题重叠的情况,比如我们学过的斐波那契数列.在斐波那契数列的求解问题中,我们经常要对一个公共子问题进行多次求解,而动态规划算法,则对每个子问题只求解一次,将其解保存在一个表格中,从而避免了大量的冗余计算量. 动态规划算法常用于寻找最优解问题(optimization problem).而其规划大概可分为四步: 1.刻画一个最优解的结构特

动态规划0—1背包问题

动态规划0-1背包问题 ? 问题描写叙述: 给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问应怎样选择装入背包的物品,使得装 入背包中物品的总价值最大? ? 对于一种物品,要么装入背包,要么不装.所以对于一种物品的装入状态能够取0和1.我们设物品i的装入状态为xi,xi∈ (0,1),此问题称为0-11背包问题. 过程分析 数据:物品个数n=5,物品重量w[n]={0,2,2,6,5,4},物品价值V[n]={0,6,3,5,4,6}, (第0位,置为0,不參与计算,仅

【算法导论之七】动态规划求解最长公共子序列

一.动态规划的概念 动态规划(Dynamic Programming)是通过组合子问题的解而解决整个问题的.分治算法是指将问题划分成一些独立的子问题,递归地求解各子问题,然后合并子问题的解而得到原始问题的解,与此不同,动态规划适用于子问题不是独立的情况,也就是各个子问题包含公共的子问题.在这种情况下,采用分治法会做许多不必要的工作,即重复地求解公共地子问题.动态规划算法对每个子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案. 动态规划通常应用于最优化问题.此类问

动态规划--0,1背包问题(再也不怕类似背包问题了)

这种类型问题三大要素:总重量.每件物品重量.每件物品价值,问最终能够塞进背包中的价值最大是多少?应该怎么选择物品? 当然也不一定是这些,例如上节所说的矿工挖矿:总人数.挖每座矿的人数.每座矿的金子数. 也就是说,只要出现了这三大要素,都可以视为0,1背包问题(物品不可拆分) 动态规划三要素:边界.最优子结构.状态转移方程. 我们一步步进行解析: 初始化:物品总重量:c=8,物品类别:n=['a','b','c','d'],物品重量:w=[2,4,5,3],物品价值:v=[5,4,6,2] 假设我

算法导论精华总结 ~ 动态规划

解释:动态规划(dynamic programming)与分治方法相似,都是通过组合子问题的解来求解原问题. 优点:动态规划比分治方法高明之处在于对每个子子问题只求解一次,将其保存,无需重新计算. 动态规划设计步骤: 刻画一个最优解的结构特征. 递归地定义最优解的值. 计算最优解的值,通常再用自底向上的方法.(维护一些额外信息,以便构造步骤4) 利用计算出的信息构造一个最优解. 钢条切割问题 描述:给定一段长度为n英寸的钢条和一个价格表Pi(i = 1,2,...,n),求切割钢条的方案,使得销

《算法导论》 调用RANDOM(0,1),实现RANDOM(a,b)的过程

描述RANDOM(a,b)的过程的一种实现,它只调用RANDOM(0,1).作为a和b的函数,你的程序的期望运行时间是多少?(RANDOM(0,1)以等概率输出0或者1,RANDOM(a,b)以等概率输出[a,b]之间的数(整数)) 要RANDOM(a,b)等概率输出[a,b]之间的数,只要等概率得到[0,b-a]之间的一个数即可.既然可以通过RANDOM(0,1)得到1或者0,这时候就能等概率把[0,b-a]区间划分成更小的区间,假设当得到1时区间缩小为[(b-a)/2,b-a],0时为[0,