背包问题

#include <iostream>
#include <iomanip>

using namespace std;

void Kanpsack(int *v,int *w,int c,int n,int m[][9])
{
    for(int i=0; i<=c; i++)
    {
        m[0][i]=0;
    }
    for(int j=0; j<=n; j++)
    {
        m[j][0]=0;
    }
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=c; j++)
        {
            if(j<w[i])
            {
                m[i][j]=m[i-1][j];
            }
            else
            {
                m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+v[i]);
            }
        }
    }
}

void Traceback(int m[][9],int *w,int n,int c,int *x,int *v)
{
    int i=n;
    int j=c;
    if(i>=0)
    {
        if(m[i][j]==m[i-1][j])
        {
            x[i]=0;
            Traceback(m,w,i-1,j,x,v);
        }
        else if(j-w[i]>=0&&m[i][j]==m[i-1][j-w[i]]+v[i])
        {
            x[i]=1;
            Traceback(m,w,i-1,j-w[i],x,v);
        }
    }
}

int main()
{
    int n=4,c=8;
    int w[5]= {0,2,3,4,5};
    int v[5]= {0,3,4,5,6};
    int m[5][9];
    int x[5];
    Kanpsack(v,w,c,n,m);
    Traceback(m,w,n,c,x,v);
    for(int i=1; i<=n; i++)
    {
        cout<<x[i]<<' ';
    }
    return 0;
}
原文地址:https://www.cnblogs.com/-Asurada-/p/10655224.html