二维的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;}