您的位置:首页 > 其它

动态规划求解0-1背包

2014-05-03 23:55 169 查看


C代码实现如下:

#include <stdio.h>
#include <stdlib.h>

int** DP(int num, int Weight, int*w, int *v);
void output(int *c, int *w, int weight, int **ptr, int num);
int main()
{

int w[] = {3, 4, 7, 8, 9};
int v[] = {4, 5, 10, 11, 13};
int num = 5, weight = 17;
int out[5] = {0};
int i = 0, j = 0;
int **ptr = NULL;

ptr = DP(num, weight, w, v);
output(out, w, weight, ptr, num);

for(i = 0; i< num; i++)
{
for(j = 0; j < weight + 1; j++)
{
printf("%2d ", ptr[i][j]);
}
printf("\n");
free(ptr[i]);
ptr[i] = NULL;
}
printf("\n");
free(ptr);
ptr = NULL;

for(i = 0; i < num; i++)
{
printf("%d ", out[i]);
}
printf("\n");
system("pause");
return 0;
}

int** DP(int num, int Weight, int*w, int *v)
{
int **arr = (int**)calloc(num, sizeof(int*));
int i = 0, j = 0;
for(i = 0; i < num; i++)
{
arr[i] = (int*)calloc(Weight + 1, sizeof(int));
}

for(i = 0; i < Weight + 1; i++)
{
arr[0][i] = 0;
}
for(i = 0; i < num; i++)
{
arr[i][0] = 0;
for(j = 0; j < Weight + 1; j++)
{
if(w[i] <= j)
{
if(i == 0)
{
arr[i][j] = v[i];
}
else
{
if(v[i] + arr[i - 1][j - w[i]] >= arr[i - 1][j])
{
arr[i][j] = v[i] + arr[i-1][j- w[i]];
}
else
{
arr[i][j] = arr[i - 1][j];
}
}
}
else
{
if(i == 0)
{
arr[i][j] = 0;
}
else
{
arr[i][j] = arr[i - 1][j];
}

}

}
}

return arr;
}

void output(int *c, int *w, int weight, int **ptr, int num)
{
int i = 0;

for(i = num - 1; i >=1; i--)
{
if(ptr[i][weight] == ptr[i - 1][weight])
{
c[i] = 0;
}
else
{
c[i] = 1;
weight -= w[i];
}

}

if(ptr[i][weight] == 0)
{
c[i] = 0;
}
else
{
c[i] = 1;
}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: