问题 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背包问题