1.源碼實現
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* 分組揹包問題
* w = (1, 2), (3), (4)
* v = (2, 4), (4), (5)
* c = 12
*/
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int w[8][8] = {{0, 0}, {2, 1, 2}, {1, 3}, {1, 4}};
int v[8][8] = {{0, 0}, {2, 2, 4}, {1, 4}, {1, 5}};
int u[8][30];
int m[8][15];
int x[8];
int n = 3;
int c = 4;
int z = 0;
int i, j, k;
memset(m, 0x00, sizeof(m));
memset(u, 0x00, sizeof(u));
for(i=1; i<=n; i++)
{
for(j=1; j<=c; j++)
{
z = m[i-1][j];
for(k=1; k<=w[i][0]; k++)
{
if(j >= w[i][k])
{
m[i][j] = max(z, m[i-1][j-w[i][k]]+v[i][k]);
if(m[i][j] > z)
{
u[i][j] = k;
z = m[i][j];
}
}
else
{
m[i][j] = z;
}
}
}
}
for(i=1; i<=n; i++)
{
for(j=1; j<=c; j++)
{
printf("%d\t", m[i][j]);
}
printf("\n");
}
for(i=n; i>=1; i--)
{
if(u[i][c])
{
x[i] = u[i][c];
c -= w[i][x[i]];
}
else
{
x[i] = 0;
}
}
for(i=1; i<=n; i++)
{
printf("%d\t", x[i]);
}
printf("\n");
return 0;
}
2.編譯源碼
$ gcc -o example examle.c -std=c89
6.運行及其結果
$ ./example
2 4 4 4
2 4 4 6
2 4 4 6
1 1 0