⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0_1背包问题.cpp

📁 经典的0-1背包问题.
💻 CPP
字号:
#include<stdio.h>
#define N 100
void knapsack(int n,int c,int v[],int w[],int **m);
void traceback(int n,int c,int w[],int **m,int x[]);
int min(int x,int y);
int max(int x,int y);
void main()
{   int w[N],v[N],x[N],n,c,k,**m;
	

	  printf("请输入物品数:");
       scanf("%d",&n);
	   printf("\n请输入容量:");
	   scanf("%d",&c);
	   printf("\n请输入各物品的重量:");
	   for (k=1;k<=n;k++)
	   {
		  scanf("%d",&w[k]);
	   }
	   printf("请输入各物品的价值:");
	   for(k=1;k<=n;k++)
	   {
		  scanf("%d",&v[k]);
	   }
	   m=new int *[n];
	   for(k=1;k<=n;k++)
	   { m[k]=new int[c];}
       knapsack(n,c,v,w,m);
        traceback(n,c,w,m,x);
		printf("选中的物品: ");
	    for (k=1;k<=n;k++)
		{	if(x[k]==1)
		   printf("%d号  ",k);
		}
      printf("\n");
	 printf("总的价值:%d\n",m[1][c]);
	
	
	

}
void knapsack(int n,int c,int v[],int w[],int **m)
{   int jmax,j,i;
     jmax=min(w[n]-1,c);
     for(j=0;j<=jmax;j++)
		 m[n][j]=0;
	 for(j=w[n];j<=c;j++)
         m[n][j]=v[n];
	 for(i=n-1;i>1;i--)
     {
		 jmax=min(w[i]-1,c);
         for(j=0;j<=jmax;j++)
          m[i][j]=m[i+1][j];
		 for(j=w[i];j<=c;j++)
           m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
     } 		 
	 m[1][c]=m[2][c];
	 if(c>=w[1])
     m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]);
}


void traceback(int n,int c,int w[],int **m,int x[])
{ 
	int i;
	for(i=1;i<n;i++)
	{  if(m[i][c]==m[i+1][c]) { x[i]=0;  printf("(%d,%d):%d ",i,c,m[i][c]);}	
       else
	   { x[i]=1;
        printf("(%d,%d):%d ",i,c,m[i][c]);
	     c-=w[i];
	   }
	     x[n]=(m[n][c])?1:0;
 	 
	}
	printf("\n");
}
int min(int x,int y)
{ 
  if(x<=y) return x;
  else return y;
}
int max(int x,int y)
{
  
  if(x>=y) return x;
  else return y;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -