01背包问题(第五讲)(附:动态规划与贪心算法的区别和联系)

问题 Y: 01背包问题(第五讲)

题目描述

有容积为w的背包,有n个物品,并且已知每个物品的体积和价值,找到一种方法将若干物品放入背包,使背包中物品的总价值最大。输入物品件数n、背包容积w、每个物品的体积和价值,输出可以装入背包中的物品的最大总价值。n不大于15。

输入

在第一行输入物品件数n和背包容积w,在下一行输入n个整数表示n个物品的体积,在第三行输入n个整数表示n个物品的价值。遇到文件末尾结束。

输出

在一行输出可以得到的背包中物品的最大总价值。

样例输入

4 8
2 4 4 3
3 4 3 6

样例输出

10

 

#include<stdio.h> 
#define N 20
int max(int a,int b)
{
	if(a>b) return a;
	return b;
}
int main()
{
	int n,w,i,j;
	int v[N],val[N],a[N][N]={0};
	scanf("%d %d",&n,&w);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&v[i]);
	}
	for(i=1;i<=n;i++)
	{
		scanf("%d",&val[i]);
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=w;j++)  //子问题的背包容量 
		{
			if(j>=v[i])
			{
				a[i][j]=max(a[i-1][j],a[i-1][j-v[i]]+val[i]);   //此处注意max里的两个比较对象
											//为不放该物品前的最优价值与放入物品后的价值比较 
			}
			else
			{
				a[i][j]=a[i-1][j];
			}
		}
	}
	printf("%d",a[n][w]);
}

 

i表示第几件物品,j表示此时背包的容量大小

 

 

附:

动态规划与贪心算法的区别和联系:

动态规划的两个基本要素:1,最优子结构性质 2.重叠子问题

贪心算法的两个基本要素:1.最优子结构性质 2.贪心选择

可从两者的基本要素可以看出,两者的共同点是都有最优子结构。

不同点:
1) 动态规划算法中,每步所做的选择往往依赖于相关子问题的解,因而只有在解出相关子问题时才能做出选择。而贪心算法,仅在当前状态下做出最好选择,即局部最优选择,然后再去解做出这个选择后产生的相应的子问题。

2) 动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常自顶向下的方式进行。

 

题目:贪心算法:月饼题

           动态规划:01背包问题

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值