dp之01背包代码

#include<iostream>
using namespace std;
int c[10][100];/*行代表是覆盖的背包个数,而列代表背包容量*/
int x[10];//存放最优解
int Knapsack(int n,int m,int w[],int v[])
{
	int i,j;
	for(i=0;i<10;i++)/*初始化数组C*/
		for(j=0;j<100;j++)
			c[i][j]=0;
	for(i=1;i<=n;i++)/*物品覆盖得越来越多*/
		for(j=1;j<=m;j++)/*背包的容量则逐一测试*/
		{
			if(w[i]<=j)/*如果物品的重量小于当前背包的容量*/
			{
				/*如果当前物品的价值+剩余容量所能装载的最大价值〉在没有选择当前物品时的最大价值则更新C[][];*/
				if(c[i-1][j]<v[i]+c[i-1][j-w[i]])
				{
					c[i][j]=v[i]+c[i-1][j-w[i]];
				}
				else//否则不更新
				{
					c[i][j]=c[i-1][j];
				}
			}
			else/*如果物品的重量大于当前背包的容量,那么这个物品不使用,这表明C[][]不变,则C[][]使用前面得到的最优解*/
			{
				c[i][j]=c[i-1][j];
			}
		}
		return c[n][m];//矩阵的最后一个为最优解。
}
void Trackback(int c[][100],int w[],int m,int n)
{
	int i;
	for(i=n;i>0;i--)
	{
		if(c[i][m]==c[i-1][m])//表示序号为i的物品没有被装入背包
			x[i]=0;
		else
		{
			x[i]=1;
			m-=w[i];
		}
	}
}
int main()
{
	int n,m;/*n为背包个数,m为背包容量*/
	int i,j;
	printf("input m and n/n");
	scanf("%d%d",&m,&n);
	int w[10],v[10];/*分别代表各个物品的重量和价值*/
	for(i=1;i<=n;i++)
		scanf("%d%d",&w[i],&v[i]);/*输入每个物品的重量W和价值V*/
	printf("%d",Knapsack(n,m,w,v));
	printf("/n");
	for(i=0;i<=n;i++)
	{
		for(j=0;j<=m;j++)
			printf("%3d",c[i][j]);
		printf("/n");
	}
	Trackback(c,w,m,n);//找最优解
	for(i=1;i<=n;i++)
		cout<<x[i]<<" ";
	cout<<endl;
	return 0;
}
/*
测试用例为:
//10是背包容量,5是背包个数
10 5
2 6
2 3
6 5
5 4
4 6
*/






#include<iostream>
using namespace std;
int c[10][100];/*行代表是覆盖的背包个数,而列代表背包容量*/
int Knapsack(int n,int m)
{
	int i,j;
	int w[10],v[10];/*分别代表各个物品的重量和价值*/
	for(i=1;i<=n;i++)
		scanf("%d%d",&w[i],&v[i]);/*输入每个物品的重量W和价值V*/
	for(i=0;i<10;i++)/*初始化数组C*/
		for(j=0;j<100;j++)
			c[i][j]=0;
	for(i=1;i<=n;i++)/*物品覆盖得越来越多*/
		for(j=1;j<=m;j++)/*背包的容量则逐一测试*/
		{
			if(w[i]<=j)/*如果物品的重量小于当前背包的容量*/
			{
				/*如果当前物品的价值+剩余容量所能装载的最大价值〉在没有选择当前物品时的最大价值则更新C[][];*/
				if(c[i-1][j]<v[i]+c[i-1][j-w[i]])
					c[i][j]=v[i]+c[i-1][j-w[i]];
				else//否则不更新
					c[i][j]=c[i-1][j];
			}
			else/*如果物品的重量大于当前背包的容量,那么这个物品不使用,这表明C[][]不变,则C[][]使用前面得到的最优解*/
				c[i][j]=c[i-1][j];
		}
		return c[n][m];
}
int main()
{
	int n,m;/*n为背包个数,m为背包容量*/
	printf("input m and n/n");
	scanf("%d%d",&m,&n);
	printf("%d",Knapsack(n,m));
	printf("/n");
	int i,j;
	for(i=0;i<=n;i++)
	{
		for(j=0;j<=m;j++)
			printf("%3d",c[i][j]);
		printf("/n");
	}
	return 0;
}
/*
测试用例为:
10 5//10是背包容量,5是背包个数
2 6
2 3
6 5
5 4
4 6
*/


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值