C语言解决背包问题

2025-10-30 07:13:58

1、首先打开VC++6.0

C语言解决背包问题

2、选择文件,新建

C语言解决背包问题

3、选择C++ source file 新建一个空白文档

C语言解决背包问题

4、首先声明头文件和常量

#include<stdio.h>

#define NUM 10/* 定义物品总数*/

#define CONTENT 10 /*定义包的容量*/

C语言解决背包问题

5、写一个函数,用来得到多个最优解

void knapsack(int v[NUM],int w[NUM],int c,int m[NUM ][CONTENT])

{

   int n=NUM-1;

   int i,j;

   int jMax;

   if((w[n]-1)< c)

jMax = w[n]-1;

   else

jMax = c;

   /* 初始化m[n][j] */

   for(j = 0; j <= jMax; j++)

m[n][j] = 0;

   for(j = jMax +1; j <= c; j++)

m[n][j] = v[n];

  /*使用非递归的算法来求解m[i][j] */

  for(i = n-1; i > 0; i--)

  {

   if((w[i]-1)< c)

   jMax = w[i]-1;

       else

   jMax = c;

       for(j = 0; j <= jMax; j++)

   m[i][j] = m[i+1][j] ;

       for(j = jMax +1; j <= c; j++)

       {

           if(m[i+1][j] >= (m[i+1][j-w[i]]+v[i]))

       m[i][j] = m[i+1][j] ;

   else

m[i][j] = m[i+1][j-w[i]]+v[i];

}

  }

  if(c>w[0])

  {

  if(m[1][c] >= (m[1][c-w[0]]+v[0]))

   m[0][c]= m[1][c];

  else

m[0][c]= m[1][c-w[0]]+v[0];

  }

  else

  m[0][c]= m[1][c];

}

C语言解决背包问题

6、再编写一个函数,用来寻找最优解

/*寻找最优解*/

void traceback(int flag[NUM],int w[NUM],int m[NUM][CONTENT])

{

int n = NUM -1;

int i;

int c = CONTENT;

for(i = 0; i < n; i++)

{

if(m[i][c] == m[i+1][c])

flag[i] = 0;

else

{

flag[i] = 1;

c-=w[i];

}

}

if(m[n][c] >0)

   flag[n] = 1;

else

   flag[n] = 0;

}

C语言解决背包问题

7、写个函数,用来输出最优解

void printResult(int flag[NUM],int w[NUM],int v[NUM],int m[NUM][CONTENT])

{

int i;

printf("the knapsack should contain:\n");

printf(" num weight value \n");

for(i = 0;i < NUM; i++)

{

if(flag[i] == 1)

           printf("  %d    %d     %d\n",i,w[i],v[i]);

}

printf("the max value in the knapsack is: %d\n",m[0][CONTENT]);

}

C语言解决背包问题

8、主函数

int main()

{

int value[NUM]={5,2,3,4,3,6,5,7,8,2};

int weight[NUM]={2,1,3,2,4,3,5,6,2,2};

int c = CONTENT;

int maxvalue[NUM][CONTENT];

int flag[NUM]={0,0,0,0,0,0,0,0,0,0};

printf("****************************************\n");

       printf("*      this program will solve         *\n");

       printf("*    the problem of 0-1knapsack        *\n");

       printf("****************************************\n");

/*计算最优值*/

knapsack(value,weight,c,maxvalue);

/*构造最优解*/

traceback(flag,weight,maxvalue);

/*打印程序的结果*/

printResult(flag,weight,value,maxvalue);

getch();

return 0;

}

C语言解决背包问题

9、运行结果

C语言解决背包问题

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢