两天的时间都在学习动态规划:小作业(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. 系统调优之numa架构

    NUMA简介 在传统的对称多处理器(SMP, Symmetric Multiprocessing)系统中,整个计算机中的所有cpu共享一个单独的内存控制器.当所有的cpu同时访问内存时,这个内存控制器 ...

  2. CAGradientLayer

    参考: CAShapeLayer和CAGradientLayer 一 简介 1,CAGradientLayer,处理颜色渐变: 2,CAGradientLayer的渐变色可以做隐式动画: 3,大部分情 ...

  3. 【leetcode❤python】 9. Palindrome Number

    #回文数#Method1:将整数转置和原数比较,一样就是回文数:负数不是回文数#这里反转整数时不需要考虑溢出,但不代表如果是C/C++等语言也不需要考虑class Solution(object):  ...

  4. CANopen笔记2

    PDO 过程数据对象用于在节点之间传送过程数据,如I/O模块I/O状态读取和设定,模拟量采集和模拟量输出等等,协议考虑从机硬件限制最多支持4组PDO,每组包含一个RPDO和一个TPDO.The Gol ...

  5. Linux 在一个命令行上执行多个命令

    Linux 在一个命令行上执行多个命令 1. [ ; ] 如果被分号(;)所分隔的命令会连续的执行下去,就算是错误的命令也会继续执行后面的命令. 2. [ && ] 如果命令被 &am ...

  6. django 简单的邮件系统

    django邮件系统 Django发送邮件官方中文文档 总结如下: 1.首先这份文档看三两遍是不行的,很多东西再看一遍就通顺了. 2.send_mail().send_mass_mail()都是对Em ...

  7. kaili 2.0 虚拟机修改ip

    第一步:将虚拟机设置为桥接状态,并勾选上复制物理网络连接状态

  8. [C和指针]第四部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. Codeforces Round #257 (Div. 2) B

    B. Jzzhu and Sequences time limit per test 1 second memory limit per test 256 megabytes input standa ...

  10. Windows Internals学习笔记(五)Synchronization

    参考资料: 1. <Windows Internals> 2. 自旋锁spinlock剖析与改进 3. Lock指令前缀 4. Lock指令前缀(二) 5. Kernel Dispatch ...