二维的0-1背包问题

来源:互联网 发布:客户端解析域名出错 编辑:程序博客网 时间:2024/05/17 22:56
#include<stdio.h>#include<stdlib.h>int m[6][11];void Traceback(int w[],int c,int n,int x[]){     int i,j;     for( i = 1; i < n ; i++)      {           if(m[i][c] == m[i+1][c])             x[i] = 0;           else { x[i] = 1; c = c-w[i];}      }               x[n] = (m[n][c]) ? 1:0;        for(j = 1; j <= n; j++)        printf("%d  ",x[j]);      printf("\n");}void Knapsack(int *value , int *weight , int contain , int n ){int jmax,i,j;int x[6] = {0};jmax = getmin(weight[n] - 1 , contain);
//初始化最后一行for(j = 0; j <= jmax; j++) m[n][j] = 0;for(j = weight[n] ; j <= contain ; j++) m[n][j] = value[n];printf("hello i am here....\n");for(i = n-1; i > 1; i--){jmax = getmin(weight[i] - 1 , contain);for(j = 0; j <= jmax ; j++)m[i][j] = m[i+1][j];for(j = weight[i]; j <= contain ; j++)m[i][j] = getmax(m[i+1][j] , m[i+1][j-weight[i]]+value[i]);}m[1][contain] = m[2][contain];if(contain >= weight[1])m[1][contain] = getmax(m[1][contain] , m[2][contain - weight[1]]+value[1]);printf("最大可装的总价值是%d\n",m[1][contain]);Traceback(weight,contain,n,x);}int getmin(int x,int y){if(x > y)return y;else  return x;}int getmax(int x,int y){if(x > y)return x;else return y;}int main(){int n = 5;int contain = 10;        int weight[6] = {0,2,2,6,5,4};        int value[6] = {0,6,3,5,4,6};        Knapsack(value , weight , contain , n);//Traceback(weight,contain,n,x);return 0;}

原创粉丝点击