c语言数据结构:01背包问题-------动态规划
两天的时间都在学习动态规划:小作业(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背包问题-------动态规划的更多相关文章
- 0-1背包问题——动态规划求解【Python】
动态规划求解0-1背包问题: 问题:背包大小 w,物品个数 n,每个物品的重量与价值分别对应 w[i] 与 v[i],求放入背包中物品的总价值最大. 动态规划核心:计算并存储小问题的最优解,并将这些最 ...
- PAT1048. Find Coins(01背包问题动态规划解法)
问题描述: Eva loves to collect coins from all over the universe, including some other planets like Mars. ...
- 【C/C++】01背包问题/动态规划
按小蓝书上写的大数据情况下没过,按解答区一个大佬的修改了过了 #include <bits/stdc++.h> using namespace std; class Solution { ...
- ACM1881 01背包问题应用
01背包问题动态规划应用 acm1881毕业bg 将必须离开的时间限制看作背包容量,先将他们由小到大排序,然后在排完序的数组中对每个实例都从它的时间限制开始(背包容量)到它的延长时间进行遍历: #in ...
- python实现算法: 多边形游戏 数塔问题 0-1背包问题 快速排序
去年的算法课挂了,本学期要重考,最近要在这方面下点功夫啦! 1.多边形游戏-动态规划 问题描述: 多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形.每个顶点被赋予一个整数值, 每条边被 ...
- 01背包问题(动态规划)python实现
01背包问题(动态规划)python实现 在01背包问题中,在选择是否要把一个物品加到背包中.必须把该物品加进去的子问题的解与不取该物品的子问题的解进行比較,这样的方式形成的问题导致了很多重叠子问题, ...
- 动态规划入门-01背包问题 - poj3624
2017-08-12 18:50:13 writer:pprp 对于最基础的动态规划01背包问题,都花了我好长时间去理解: poj3624是一个最基本的01背包问题: 题意:给你N个物品,给你一个容量 ...
- 动态规划专题 01背包问题详解 HDU 2546 饭卡
我以此题为例,详细分析01背包问题,希望该题能够为大家对01背包问题的理解有所帮助,对这篇博文有什么问题可以向我提问,一同进步^_^ 饭卡 Time Limit: 5000/1000 MS (Java ...
- C++动态规划求解0-1背包问题
问题描述: 给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问:应该如何选择装入背包的物品,是的装入背包中物品的总价值最大? 细节须知: 暂无. 算法原理: a.最优子结构性质 ...
随机推荐
- Xcode的Architectures和Valid Architectures的区别,
登录 | 注册 ys410900345的专栏 目录视图摘要视图订阅 学院APP首次下载,可得50C币! 欢迎来帮助开源“进步” 当讲师?爱学习?投票攒课吧 CSDN 2015博 ...
- Linux Source命令及脚本的执行方式解析
转 http://www.51testing.com/html/38/225738-206878.html 当我修改了/etc/profile文件,我想让它立刻生效,而不用重新登录:这时就想到用sou ...
- [C语言](*p)++与 ++(*p)与 *p++ 与 ++*p
首先亮明个人观点,不要认为这样写都算写的不好,还强调大神一般不写这种代码,可读性不高 其实是你的C语言基础太差,读不懂,大神还真的就是这么写的.可以看看C语言库函数中的一些写法 *P++ :*和++都 ...
- 改变CSS样式
改变CSS样式 1.改变HTML元素样式的语法 //改变HTML样式的语法 document.getElementById(id).style.property = new style 例子: < ...
- Python3基础 多分支结构 if-elif-else
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- 我的android学习经历19
怎样在标题栏中显示进度条 import android.app.Activity;import android.os.Bundle;import android.view.Window; public ...
- SQL数据库约束行为---防止数据完全重复
防止同一条数据完全重复: 一.主关键字约束:主键约束.1.能够唯一的区分每一行数据.——不许重2.表中的数据按照主键字排序的.——有序3.主键字不能为空——不为空4.一个表只能有一个主键,但可以设置组 ...
- 【leetcode❤python】Move Zeroes
#-*- coding: UTF-8 -*- #filter()函数可以对序列做过滤处理,就是说可以使用一个自定的函数过滤一个序列,#把序列的每一项传到自定义的过滤函数里处理,并返回结果做过滤.最终一 ...
- BP神经网络求解异或问题(Python实现)
反向传播算法(Back Propagation)分二步进行,即正向传播和反向传播.这两个过程简述如下: 1.正向传播 输入的样本从输入层经过隐单元一层一层进行处理,传向输出层:在逐层处理的过程中.在输 ...
- 线程入门之sleep
package com.thread; /** * <sleep:使线程休眠一些时间> * <功能详细描述> * * @author 95Yang */ public clas ...