#include<stdio.h>
#include<stdlib.h>
int m[6][5][8]; //m[i][j][k]表示背包容量为j,背包体积为k,可选物品为i,i+1,i+2.....,n时背包问题的最优解
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;
}
void Traceback(int w[],int b[] ,int c,int d,int n,int x[])
{
int i,j;
for( i = 1; i < n ; i++)
{
if(m[i][c][d] == m[i+1][c][d])
x[i] = 0;
else { x[i] = 1; c = c-w[i]; d = d-b[i] ;}
}
x[n] = (m[n][c][d]) ? 1:0;
for(j = 1; j <= n; j++)
printf("%d ",x[j]);
printf("\n");
}
void Knapsack(int *value , int *weight , int *b , int contain ,int d, int n )
{
int i,k;
int j = 0;
int x[6] = {0};
//先处理记录表格中的最后一行,
for(j = 0; j <= contain; j++)
for(k = 0; k <= d ; k++)
{
if(weight[n] <= j && b[n] <= k)
m[n][j][k] = value[n];
else
m[n][j][k] = 0;
}
//循环处理记录表格中的其他行,
for(i = n-1 ; i > 1; i--)
{
for(j = 0; j <= contain; j++)
for(k = 0; k <= d ; k++)
{
if(weight[i] <= j && b[i] <= k)
m[i][j][k] = getmax(m[i+1][j][k] , m[i+1][j-weight[i]][k - b[i]] + value[i] );
else
m[i][j][k] = m[i+1][j][k];
}
}
//处理记录表格中的第一行,
m[1][contain][d] = m[2][contain][d];
if(contain >= weight[1] && d >= b[1])
m[1][contain][d] = getmax(m[1][contain][d] , m[2][contain - weight[1]][d - b[1]]+value[1]);
printf("the biggest value is %d\n",m[1][contain][d]);
Traceback(weight, b ,contain,d,n,x);
}
int main()
{
int n = 5; //物品数量
int contain = 4; //背包容量
int d = 7; //背包容积
int weight[6] = {0,5,2,6,5,4}; //物品重量
int value[6] = {0,2,3,5,4,6}; //物品价值
int b[6] = {0,2,2,5,1,4}; //物品体积
Knapsack(value , weight ,b , contain , d , n);
return 0;
}
0-1背包问题之动态规划解决算法(二)
猜你喜欢
转载自blog.csdn.net/qq_40685275/article/details/80155356
今日推荐
周排行