0-1背包问题 动态规划法

0-1背包问题:给定n种物品和一个背包,物品i的重量是wi,价值是vi,背包的容量是c。应如何选择装入背包的物品,使装入背包的物品的价值最大?

实例:n=5,c=10, v={6 3 5 4 6}, w={2 2 6 5 4},最优值是15.


//0-1背包问题
#include <stdio.h>

#define min(a,b) a>b?b:a
#define max(a,b) a>b?a:b

int main()
{
	int n,c;
	int *w,	*v,*flag; //w代表每个物品的容积,v代表价值, flag代表是否出现
	int **m; //m[i,j]用来存储当剩余容量为j时,可选择的物品为i,i+1,...时,0-1背包问题的最优值
	int i,j,k;
	int jMax;	

	printf("please input the number of things and the volume of the knap:");
	scanf("%d %d",&n,&c);
	
	w=new int [n];
	v=new int [n];
	flag=new int [n];

	m=new int *[n];
	for(i=0;i<n;i++)
		m[i]=new int [c+1];

	printf("input the volume of each thing:");
	for(i=0;i<n;i++)
		scanf("%d", &w[i]);

	printf("input the value of each thing:");
	for(i=0;i<n;i++)
		scanf("%d",&v[i]);

	//从最后一个元素倒着推导,即第n-1个元素
	jMax=min(w[n-1]-1,c);
	for(j=0;j<=jMax;j++)
		m[n-1][j]=0;
	for(j=w[n-1];j<=c;j++)
		m[n-1][j]=v[n-1];

	for(i=n-2;i>0;i--)
	{
		jMax=min(w[i]-1,c);
		for(j=0;j<jMax;j++)
			m[i][j]=m[i+1][j];
		for(j=jMax;j<=c;j++)
			m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
	}

	m[0][c]=m[1][c];
	if(c>=w[0]) 
		m[0][c]=max(m[1][c],m[1][c-w[0]]+v[0]);	

	printf("the max value is %d. and the concrete are:\n",m[0][c]);

	for(i=0;i<n-1;i++)
	{
		if(m[i][c]==m[i+1][c]) 
			flag[i]=0;
		else
		{
			flag[i]=1;
			c=c-w[i];
		}
		flag[n-1]=(m[n-1][c])?1:0;
	}

	for(i=0;i<n;i++)
		if (flag[i])
			printf("%d ",v[i]);

	printf("\n");

	return 0;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值