01背包问题
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
数据范围
0<N,V≤1000
0<vi,wi≤1000
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
8
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
int n,v,a[1010],b[1010],i,j,k,s,d[1010];
scanf("%d%d",&n,&v);
for(i=1;i<=n;i++)
scanf("%d%d",&a[i],&b[i]);
for(i=0;i<=v;i++)//初始化数组
d[i]=0;
for(i=1;i<=n;i++)
for(j=v;j>=a[i];j--)
{
d[j]=max(d[j],d[j-a[i]]+b[i]);//不选当前物品和选当前物品的最大值
}
printf("%d\n",d[v]);
}
样例数据
当i=1时,j从最大开始j=5到j=1都可以装下第一个i,所有价值就是2
当i=2时,j=5开始,因为当想要第二个物品就要为他腾出空间,所以d[j]=max(d[j],d[j-a[i]]+b[i]);这个时候d[5]=d[5-a[2]]+b[2]=6,当j=2时我们发现选择第二种物品比第一种物品的价值更大,所以我们会选择第二种物品,j=1时,选择第一种。
当i=3时,j=5开始,这时候想要第三件物品就要为第三件物品腾出空间也是5-3=2,这个2就代表你只有2的空间去选择前两件物品,我们发现当空间为2时,价值最大为4,所以这时候d[5]=8,同理可求出4,3,2,1。
一直计算出所以i选或者不选的情况.
当我们想要这件物品就需要为这件物品腾出空间,也就是j-a[i]再加上它的价值b[i]与它不选择这件物品的d[j]比较选出最大值.