c语言数据结构:01背包问题-------动态规划

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

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

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

可是----------------------------------------学习

两天的时间才完成这个laburl

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

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

背包承重为U。假设有十个物品,从左往右依次编号排列,能够采起以下步骤:递归

1.站在第10个物品处,一个物品只有选择和未被选择两种状况,若是选择了当前物品,那么选了它以后跟不选它所获得的价值谁大一点?其实咱们采用递归两种状况都会考虑的get

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);
}
}
相关文章
相关标签/搜索