两天的时间都在学习动态规划:小作业(01背包问题:)

数据结构老师布置的这个小作业还真是让人伤头脑,自己实在想不出来了便去网上寻找讲解,看到一篇不错的文章:

http://www.cnblogs.com/sdjl/articles/1274312.html -------通过金矿模型介绍动态规划

但是----------------------------------------

两天的时间才完成这个lab

总结:1.思维思路要清晰。2.题目信息要看清楚。3.改代码过程中注意小变量的数值是否同步变化。

01背包问题思路(自顶向下):

背包承重为U。假设有十个物品,从左往右依次编号排列,可以采取如下步骤:

1.站在第10个物品处,一个物品只有选择和未被选择两种情况,如果选择了当前物品,那么选了它之后跟不选它所得到的价值谁大一点?其实我们采用递归两种情况都会考虑的

i:当前物品重量大于U,那肯定就不能选择这个物品,直接就考虑前9个物品的选择情况了,此时去看第九个物品。

ii:当前物品重量小于U,可以选择也可以不选择,但是我们要看哪种情况更好,更优:选择这个物品,假设前9个物品的选择最优情况(此时背包容量会变小,因为选择了第10个物品)我们已经得知了,此时可以得到在选择第10个物品的情况下的价值,而如果不选择这个物品,那么我们同样假设前9个物品的最优选择情况(此时背包容量还是U)已经得知了,那么我们从这选与不选的两种情况中选择最大的一种方案下就是原问题的最优解了。

iii:这是递归的过程,每个问题都需要有前面的最好的选择方案才可以得出最优解,所以需要一个递推边界情况,当考虑第一个物品的时候,也就是考虑的物品中剩余的最后一个的时候,如果不选,因为前面已经没有物品了,所以什么也放不进背包,得到的价值是0;如果选了,那就是当前物品的价值。

贴代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
int max_o,max_w;
#define max_o (3)
#define max_w (50)
int weight[max_o]; //用来存储物品重量
int value[max_o]; //用来存储物品价值
int pri[max_o]; //用来标记物品是否被选择
int maxval[max_o]; //用来作备忘 void inia()
{
int j;
for(j=0;j<max_o;j++)
maxval[j]=0;
} void inib()
{
int j;
for(j=0;j<max_o;j++)
{
pri[j]=0;
}
} int max(int a,int b)
{
return a>b?a:b;
}
int getmax(int maxweight,int max_n)
{
int maxret; int o,k; if(maxval[max_n]!=0) return maxval[max_n]; if(max_n==0)
{
if(weight[max_n]>maxweight)
maxret=0;
else {
maxret=value[max_n];
pri[max_n]=max_n;
}
}
else if(weight[max_n]<=maxweight)
{
o=getmax(maxweight-weight[max_n],max_n-1)+value[max_n];
k=getmax(maxweight,max_n-1);
if(o>k)
pri[max_n]=max_n;
maxret=max(o,k);
}
else
{
maxret = getmax(maxweight,max_n-1);
}
maxval[max_n] = maxret; return maxret;
}
void main()
{ int i;
inia();
inib();
for(i=0;i<max_o;i++)
{
scanf("%d%d",&weight[i],&value[i]);
}
printf("%d\n",getmax(max_w,max_o-1));
for(i=0;i<max_o;i++)
{
if(pri[i]!=0)
printf("第%d个物品被选择\n",pri[i]+1);
}
}

  

  

c语言数据结构:01背包问题-------动态规划的更多相关文章

  1. 0-1背包问题——动态规划求解【Python】

    动态规划求解0-1背包问题: 问题:背包大小 w,物品个数 n,每个物品的重量与价值分别对应 w[i] 与 v[i],求放入背包中物品的总价值最大. 动态规划核心:计算并存储小问题的最优解,并将这些最 ...

  2. PAT1048. Find Coins(01背包问题动态规划解法)

    问题描述: Eva loves to collect coins from all over the universe, including some other planets like Mars. ...

  3. 【C/C++】01背包问题/动态规划

    按小蓝书上写的大数据情况下没过,按解答区一个大佬的修改了过了 #include <bits/stdc++.h> using namespace std; class Solution { ...

  4. ACM1881 01背包问题应用

    01背包问题动态规划应用 acm1881毕业bg 将必须离开的时间限制看作背包容量,先将他们由小到大排序,然后在排完序的数组中对每个实例都从它的时间限制开始(背包容量)到它的延长时间进行遍历: #in ...

  5. python实现算法: 多边形游戏 数塔问题 0-1背包问题 快速排序

    去年的算法课挂了,本学期要重考,最近要在这方面下点功夫啦! 1.多边形游戏-动态规划 问题描述: 多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形.每个顶点被赋予一个整数值, 每条边被 ...

  6. 01背包问题(动态规划)python实现

    01背包问题(动态规划)python实现 在01背包问题中,在选择是否要把一个物品加到背包中.必须把该物品加进去的子问题的解与不取该物品的子问题的解进行比較,这样的方式形成的问题导致了很多重叠子问题, ...

  7. 动态规划入门-01背包问题 - poj3624

    2017-08-12 18:50:13 writer:pprp 对于最基础的动态规划01背包问题,都花了我好长时间去理解: poj3624是一个最基本的01背包问题: 题意:给你N个物品,给你一个容量 ...

  8. 动态规划专题 01背包问题详解 HDU 2546 饭卡

    我以此题为例,详细分析01背包问题,希望该题能够为大家对01背包问题的理解有所帮助,对这篇博文有什么问题可以向我提问,一同进步^_^ 饭卡 Time Limit: 5000/1000 MS (Java ...

  9. C++动态规划求解0-1背包问题

    问题描述: 给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问:应该如何选择装入背包的物品,是的装入背包中物品的总价值最大? 细节须知: 暂无. 算法原理: a.最优子结构性质 ...

随机推荐

  1. Json 入门例子【2】

    <script> var json1 = { "id": 1, "tagName": "apple" }; $("#f ...

  2. 区分一下dpkg,rpm和yum以及apt-get

    一般来说著名的 Linux 系统基本上分两大类: RedHat 系列:Redhat.Centos.Fedora 等 Debian 系列:Debian.Ubuntu 等 Dpkg (Debian系):U ...

  3. Linux运维命令之一

    释放内存:syncecho 3 > /proc/sys/vm/drop_caches Linux查看Dell服务器型号命令:dmidecode | grep "Product Name ...

  4. wifi漫游测试过程

    欢迎加入Wince技术讨论群QQ#326444254 这个是我最近测试wifi漫游的一些方法,后续会继续更新,让大家了解测试wifi漫游的方法,由于现在支持wince wifi驱动的厂家非常少,所以支 ...

  5. 只用css来美化的上传表单按钮(抄的迅雷的)

    <!DOCTYPE html><html><head><meta charset="utf-8" /><title>文件 ...

  6. DataTables warning : Requested unknown parameter '5' from the data source for row 0

    在该项目中我使用了jquery.dataTables.js来作为我的前端数据表格. 表格的官网地址:https://www.datatables.net/ 一.jsp部分代码片段如下: <tab ...

  7. PythonOCC 3D图形库学习—创建立方体模型

    Open CASCADE(简称OCC)平台是是一个开源的C++类库,OCC主要用于开发二维和三维几何建模应用程序,包括通用的或专业的计算机辅助设计CAD系统.制造或分析领域的应用程序.仿真应用程序或图 ...

  8. vim 跳到指定行

    在编辑模式下输入 ngg 或者 nG n为指定的行数(如25) 25gg或者25G 跳转到第25行. 在命令模式下输入行号n : n 如果想打开文件即跳转 vim +n FileName 查看当然光标 ...

  9. IP地址验证

    /** * 验证IP地址 * * @param 待验证的字符串 * @return 如果是符合格式的字符串,返回 <b>true </b>,否则为 <b>false ...

  10. iOS - OC 内存管理

    1.OC 基本内存管理模型 1.1 自动垃圾收集 在 OC 2.0 中,有一种称为垃圾收集的内存管理形式.通过垃圾收集,系统能够自动监测对象是否拥有其他的对象,当程序执行需要空间的时候,不再被引用的对 ...