c語言解決分組揹包問題

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   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章