枚舉法解決一切 0--1揹包問題

一.當3個物品數量,總揹包爲40時      每個物品重量 10 20 30    價值爲  70 80 150 

 代碼如下:

#include<stdio.h>
#define n 3
possible_solution(int x[n]){
	int i;
	for(i=0;i<3;i++)
	  if(x[i]!=1) { x[i]=1;return;}
	  else   x[i]=0;
	  return;
}
int main(){
	int w[n]={10,20,30},v[n]={70,80,150};
	int x[n]={0,0,0},y[n]={0,0,0};
	int tw,tv,tv1=0,limit=40;
	int j;
	for(j=1;j<=8;j++){
		possible_solution(x);
		tw=x[0]*w[0]+x[1]*w[1]+x[2]*w[2];
		tv=x[0]*v[0]+x[1]*v[1]+x[2]*v[2];
		if(tw<=limit&&tv>tv1){
			tv1=tv; y[0]=x[0];y[1]=x[1];y[2]=x[2];
		}
	}
	printf("0-1揹包問題的最優解 y=(%d,%d,%d)\n",y[0],y[1],y[2]);
	printf("總價值爲:%d",tv1);
}

通過此代碼過程,可以給出通用的枚舉法解決所有揹包問題

代碼如下:

#include<stdio.h>
#include<math.h>
int n; 
int fun(int x[n]){
	int i;
	for(i=0;i<n;i++) 
	   if(x[i]!=1)  {x[i]=1; return;}
	   else x[i]=0;
	   return;
}

int main(){
    int w[100],v[100];
	int x[100]={0},y[100]={0};
	int tv=0,tv1=0,tw=0,i,j,limit;
	printf("請輸入多少數量:"); 
	scanf("%d",&n);
	printf("請輸入揹包的容量:");
	 scanf("%d",&limit); 
	 printf("輸入每個產品的重量:"); 
	for(i=0;i<n;i++)
		scanf("%d",&w[i]);
	  printf("輸入每個產品的價值:");
	for(i=0;i<n;i++)
	    scanf("%d",&v[i]);
	for(j=1;j<=pow(2,n);j++){
		fun(x);
		for(i=0;i<n;i++){
			tw+=w[i]*x[i];
			tv+=v[i]*x[i];
		}
		if(tw<=limit&&tv>tv1){
			tv1=tv;    
			for(i=0;i<n;i++){
				y[i]=x[i];		
			}
		}
		tw=0;
		tv=0;
	}
	printf("0-1揹包問題的最優解爲:");
	  for(i=0;i<n;i++)  printf("%d ",y[i]);
	  printf("\n總價值爲:%d",tv1);	
}

神來之筆:

int fun(int x[n]){
	int i;
	for(i=0;i<n;i++) 
	   if(x[i]!=1)  {x[i]=1; return;}
	   else x[i]=0;
	   return;
}

這個代碼可以直接取每個商品的數量是0還是1,要是我寫的話,可能用幾個for循環遍歷0和1吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章