背包问题之0-1背包(二)

问题描述:有n个物品,第i个物品的重量为w[i],价值为v[i]。选一些物品放入背包中,使背包内物品总重量恰好为W的前提下,总价值尽量大。

输入:有多组测试数据,每组数据第一行为2个正整数,分别代表物品的个数n和背包的容量W,接下来的n行,每行2个正整数,用空格隔开,分别代表物品的重量w和价值v, 当n、W同时为0时结束测试,此时不输出。所有输入数字的范围大于等于0,小于等于1000。
输出:若能恰好放满背包则输出最大总价值,否则输出No,每组输出占一行。
解题思路:与0-1背包(一)类似,设f[i][j]表示前i(1<=i<=n)个物品选择放入容量为j(0<=j<=n)的背包中能恰好放满时达到的最大总价值,并用f[i][j]=-1表示前i个物品不能恰好把容量为j的背包放满,因此对于第i个物品能不能放入容量为j的背包中不仅取决于j>=w[i],还要满足f[i-1][ j-w[i] ]!=-1;
故: if(j>=w[i]&&f[i][j-w[i]]!=-1)
        { f[i][j]=max( f[i-1][j] , f[i-1][ j-w[i] ]+w[i] ) }
    else
       { f[i][j]=f[i-1][j] }
当然仍然可以像0-1背包(一)一样用滚动数组来优化空间。
源代码如下:

#include <stdio.h>
#include <string.h>
#define maxn 1001
int f[maxn];

int main()
{
	int n,W,w,v,i,j;
	while(scanf("%d%d",&n,&W)&&(n+W))
	{
		memset(f,-1,sizeof(f));     //注意memset()只能把数组元素全赋值为0或-1  
		f[0]=0;                    //当还没有物品时只有容量为0的背包可以放满,且最大价值为0,故f[j]初始化为f[0]=0 , f[1.....n]=-1 
		for(i=1;i<=n;i++)        
		{
			scanf("%d%d",&w,&v);
		
			for(j=W;j>=w;j--)
				if(f[j-w]!=-1&&f[j-w]+v>f[j])
					f[j]=f[j-w]+v;
		}
		if(f[W]!=-1)
		  printf("%d\n",f[W]);
		else
		  printf("No\n");
	}

	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值