0-1背包——回溯——c语言

#include 
#include 
int Bestvalue,weight,value,capacity;//分别是最大价值,每种情况的重量和价值,背包的容量   
void Backtrack(int w[],int v[],int best[],int x[],int n,int num)	//回溯 
{int i,j;
	if(n>=num)	//最多num个,到最后一个进行比较 
		{
			if(value>Bestvalue)//如果该种方法的价值能够超过最大价值则采用该方法 
				{
					Bestvalue=value;
					for(j=0;j<num;j++)		//保存采取的方法 
					{
						best[j]=x[j];
					}
				}
		}
	else{
		for(i=0;i<=1;i++)	//根据二进制01试可能的所有方法 
			{
			x[n]=i;		//各种方法 
			if(i==0)
				{
				Backtrack(w,v,best,x,n+1,num); 	//如果为零就递归到下一个 
				}
			else{
				if(weight+w[n]<=capacity)
				
					{
					weight+=w[n];		//选择就加上被选则物品的重量和价值 
					value+=v[n];
					Backtrack(w,v,best,x,n+1,num);
					weight-=w[n];		//每一种的方法算完之后减去被选中的重量和价值,可以使得每种方法的最开始的重量和价值都为0 
					value-=v[n];
					}
			}
		}
	}
} 
int main()
{	int num; 
	printf("请输入背包的容量:");
	scanf("%d",&capacity);
	printf("请输入物品数量:");
	scanf("%d",&num);
	int w[num],v[num],i,best[num],x[num];
	printf("请输入物品的重量:");
	for(i=0;i<num;i++)
		scanf("%d",&w[i]);
	printf("请输入物品的价值:");
	for(i=0;i<num;i++)
		scanf("%d",&v[i]);
	Backtrack(w,v,best,x,0,num);	
	printf("最优的选择为(0为不选,1为选):"); 
	for(i=0;i<num;i++)
		printf("%d ",best[i]);
	return 0; 
} 

你可能感兴趣的:(练题杂记,算法,c语言)