01背包,完全背包,多重背包

01背包

#include <stdio.h>
int c[101][1001]={0};//定义100个物品1000重量的总价值数组
void calcMaxValues(int n,int t_w)
{
	int i,j;
	int w[101]={0},v[101]={0};//w单个物品的重量,v单个物品的价值
	for(i=1;i<=n;i++){
		scanf("%d%d",&w[i],&v[i]);
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=t_w;j++){
			if(w[i]<=j){
				if(v[i]+c[i-1][j-w[i]]>c[i-1][j]){
					c[i][j]=v[i]+c[i-1][j-w[i]];
				}
				else{
					c[i][j]=c[i-1][j];
				}
			}
			else{
				c[i][j]=c[i-1][j];
			}
		}
	}
	printf("%d",c[n][t_w]);
}
int _tmain(int argc, _TCHAR* argv[])
{
	int num,weight;/*num表示物品的件数,weight表示能装下物品的总重量*/
	scanf("%d%d",&num,&weight);
	calcMaxValues(num,weight);
	getchar();
	return 0;
}

01背包的空间优化版

#include <stdio.h>
int c[1001]={0};//空间优化
void calcMaxValueAboutBagpack_optimize(int n,int t_w)
{
	int i,j;
	int w[101]={0},v[101]={0}; //w单个物品的重量,v单个物品的价值
	for(i=1;i<=n;i++){
		scanf("%d%d",&w[i],&v[i]);
	}
	for(i=1;i<=n;i++)//n件物品
	{
		for(j=t_w;j>0;j--){//物品的重量,或者说是容量  用逆序保存
			if(w[i]<=j &&(v[i]+c[j-w[i]])>c[j]){ //如果重量可以放得下,且放下的值之和大于当前要放下位置的值
					c[j]=v[i]+c[j-w[i]];
			}
		}
	}
	printf("%d",c[t_w]);
}

int main()
{
	int num,weight;/*num表示物品的件数,weight表示能装下物品的总重量*/
	scanf("%d%d",&num,&weight);
	calcMaxValueAboutBagpack_optimize(num,weight);
	getchar();
	return 0;
}

完全背包

都是空间优化过的,这个还可以进行优化。如果物品A的价值小于物品B的价值,且物品A的容量大于物品B,那么物品A不用考虑。

#include <stdio.h>
int c[1001]={0};//空间优化
void FullBagpack(int n,int t_w)
{
	int i,j;
	int w[101]={0},v[101]={0}; //w单个物品的重量,v单个物品的价值
	for(i=1;i<=n;i++){
		scanf("%d%d",&w[i],&v[i]);
	}
	for(i=1;i<=n;i++)//n件物品
	{
		for(j=1;j<=t_w;j++){//物品的重量,或者说是容量  用逆序保存
			if(w[i]<=j &&(v[i]+c[j-w[i]])>c[j]){ //如果重量可以放得下,

且放下的值之和大于当前要放下位置的值
				c[j]=v[i]+c[j-w[i]];
			}
		}
	}
	printf("%d",c[t_w]);
}

int _tmain(int argc, _TCHAR* argv[])
{
	int num,weight;/*num表示物品的件数,weight表示能装下物品的总重量*/
	scanf("%d%d",&num,&weight);
	FullBagpack(num,weight);
	getchar();
	return 0;
}

多层背包

空间优化过


#include <stdio.h>


int c[1001]={0};//空间优化
void calcMaxValueAboutMultipleBagpack_optimize(int t_n,int t_w)
{
	int i,j;
	int w[101]={0},v[101]={0},n[101]={0}; //w单个物品的重量,v单个物品的价值,n表示每个物品的件数
	for(i=1;i<=t_n;i++){
		scanf("%d%d%d",&w[i],&v[i],&n[i]);
	}
	for(i=1;i<=t_n;i++)//n件物品
	{
		for(j=t_w;j>0;j--){//物品的重量,或者说是容量  同样用01背包逆序储存解决空间量的问题
			if(w[i]<=j){ //如果重量可以放得下
				int cur_max_w=j/w[i];//cur_max_w表示能放下当前最大物品重量的几倍
				if(cur_max_w>=n[i]){//如果当前能放下的个数小于或等于该物品设定的个数
					if (v[i]*n[i]+c[j-w[i]*n[i]]>c[j]) //且当前物品的价值*该物品的数量+没放入该物品*数量时的价值 是否大于当前总价值
					{
						c[j]=v[i]*n[i]+c[j-w[i]*n[i]];
					} 	
				}
				else{
					if (v[i]*cur_max_w+c[j-w[i]*cur_max_w]>c[j]) //且当前物品的价值*该物品的数量+没放入该物品*数量时的价值 是否大于当前总价值
					{
						c[j]=v[i]*cur_max_w+c[j-w[i]*cur_max_w];
					} 
				}
				
			}
		}
		//打印表格看看是否与预期的一样
		for(int k=1;k<=t_w;k++)
		{
			printf("%d  ",c[k]);
		}
		printf("\n");
	}
	printf("%d",c[t_w]);
}

int main()
{
	int num,weight;/*num表示物品的件数,weight表示能装下物品的总重量*/
	scanf("%d%d",&num,&weight);
	calcMaxValueAboutMultipleBagpack_optimize(num,weight);
	getchar();
	return 0;
}

说明:_tmian 是vs2010开发环境生成的,换成mian即可。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值