两天的时间都在学习动态规划:小作业(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. 分布式算法一——一致性hash算法

    摘自:http://blog.csdn.net/sparkliang/article/details/5279393

  2. Python if条件语句

    1. if 条件语句 if 条件: 内容1 内容2 else: 内容3 内容4 # 一个等号是赋值(=) # 两个等号是比较(==) #不等号(!=) #if 条件1 and 条件2(并且) #if ...

  3. 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

    package C; public class Bisai { public static void main(String[] args) { String a="xyz",b= ...

  4. FZU 2143 Board Game

    Board Game Accept: 95    Submit: 246Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Descri ...

  5. Cheatsheet: 2013 09.01 ~ 09.09

    .NET Multi Threaded WebScraping in CSharpDotNetTech .NET Asynchronous Patterns An Overview of Projec ...

  6. Quartz实用二三事

    注意:本文项目使用的Quartz版本为2.2.1 一.关于Trigger Trigger tg = newTrigger().withIdentity("tg3", "g ...

  7. [HDOJ1232]畅通工程

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  8. 【分享】通过Excel生成批量SQL语句,处理大量数据的好办法

    我们经常会遇到这样的要求:用户给发过来一些数据,要我们直接给存放到数据库里面,有的是Insert,有的是Update等等,少量的数据我们可以采取最原始的办法,也就是在SQL里面用Insert into ...

  9. poj 3304线段与直线相交

    http://poj.org/problem?id=3304 Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: ...

  10. POJ 3286 How many 0's?(几多0?)

    POJ 3286 How many 0's?(几多0?) Time Limit: 1000MS   Memory Limit: 65536K [Description] [题目描述] A Benedi ...