0-1背包问题
Time Limit: 2000MS Memory Limit: 65536KB
Total Submissions: 125 Accepted: 52
Share
Description:
       给定n 种物品和一个背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?,并输出最佳装包方案
Input:
输入文件Knap.in有3行,第1 行有2 个正整数n 和C,分别表示有n种物品,背包的容量为C。接下来的2 行中,每行有n 个数,分别表示各物品的价值和重量(重量各不相同)。
Output:
输出文件Knap.out有2行,第1行是最大价值,第2行是最佳装包方案。
Sample Input:
5 10
6 3 5 4 6
2 2 6 5 4
Sample Output:
15
1 1 0 0 1
Hint:
n<=100,C<=1000
Source:
#include<stdio.h>
int n;
int c;
int cw;
int cp;
int bestp=0;
int pr;
int p[1005],w[1005],x[1005],bestx[1005];
int constraint( int t)
{
	if((x[t]==0) || (x[t]==1 && cw+w[t]<=c)) return 1;
	else return 0;
}
int bound(int t)
{
	int i;	
	pr=0;
	for(i=t+1;i<=n;i++)
		pr=pr+p[i];
	if((x[t]==1)||(x[t]==0&&pr+cp>=bestp)) return 1;
	else return 0;
}
void backtrack(int t)
{
	int i;
	if(t>n)
	{
		bestp=cp;
		for(i=1;i<=n;i++)
			bestx[i]=x[i];
	}
	else 
		for(i=0;i<=1;i++)
		{
			x[t]=i;
			if (constraint(t)&&bound(t))
			{
				if(x[t]==1)
				{
					cw=cw+w[t];
					cp=cp+p[t];
				}
				backtrack(t+1);
				if(x[t]==1)
				{
					cw=cw-w[t];
					cp=cp-p[t];
				}
			}
		}
}

int main()
{

	int i,j;
	scanf("%d%d",&n,&c);
	for(i=1;i<=n;i++)
		scanf("%d",&p[i]);
	for(j=1;j<=n;j++)
		scanf("%d",&w[j]);
	backtrack(1);
	printf("%d\n",bestp);
    printf("%d",bestx[1]);
    for(i=2;i<=n;i++)
		printf(" %d",bestx[i]);
	return 0;
}