您的位置:首页 > 其它

动态规划之01背包问题

2013-10-22 23:25 239 查看
 

[cpp] view
plaincopy

#include  

using namespace std;  

int c[10][100];  

int Knapsack(int n,int m)  

{  

    int i,j;  

    int w[10],v[10];  

    for(i=1;i<=n;i++)  

        scanf("%d%d",&w[i],&v[i]);  

    for(i=0;i<10;i++)  

        for(j=0;j<100;j++)  

            c[i][j]=0;  

    for(i=1;i<=n;i++)  

        for(j=1;j<=m;j++)  

        {  

            if(w[i]<=j)  

            {  

                  

                if(c[i-1][j]

                    c[i][j]=v[i]+c[i-1][j-w[i]];  

                else//否则不更新  

                    c[i][j]=c[i-1][j];  

            }  

            else  

                c[i][j]=c[i-1][j];  

        }  

        return c
[m];  

}  

int main()  

{  

    int n,m;  

    printf("input m and n/n");  

    scanf("%d%d",&m,&n);  

    printf("%d",Knapsack(n,m));  

    printf("/n");  

    int i,j;  

    for(i=0;i<=n;i++)  

    {  

        for(j=0;j<=m;j++)  

            printf("=",c[i][j]);  

        printf("/n");  

    }  

    return 0;  

}  

  

 

上面的算法没有提供找最优解序列的方法,下面给出找最有解序列的代码

 

[c-sharp] view
plaincopy

#include  

using namespace std;  

int c[10][100];  

int x[10];//存放最优解  

int Knapsack(int n,int m,int w[],int v[])  

{  

    int i,j;  

    for(i=0;i<10;i++)  

        for(j=0;j<100;j++)  

            c[i][j]=0;  

    for(i=1;i<=n;i++)  

        for(j=1;j<=m;j++)  

        {  

            if(w[i]<=j)  

            {  

                  

                if(c[i-1][j]

                {  

                    c[i][j]=v[i]+c[i-1][j-w[i]];  

                }  

                else//否则不更新  

                {  

                    c[i][j]=c[i-1][j];  

                }  

            }  

            else  

            {  

                c[i][j]=c[i-1][j];  

            }  

        }  

        return c
[m];//矩阵的最后一个为最优解。  

}  

  

void Trackback(int c[][100],int w[],int m,int n)  

{  

    int i;  

    for(i=n;i>0;i--)  

    {  

        if(c[i][m]==c[i-1][m])//表示序号为i的物品没有被装入背包  

            x[i]=0;  

        else  

        {  

            x[i]=1;  

            m-=w[i];  

        }  

    }  

}  

  

int main()  

{  

    int n,m;  

    int i,j;  

    printf("input m and n/n");  

    scanf("%d%d",&m,&n);  

    int w[10],v[10];  

    for(i=1;i<=n;i++)  

        scanf("%d%d",&w[i],&v[i]);  

  

    printf("%d",Knapsack(n,m,w,v));  

    printf("/n");  

  

    for(i=0;i<=n;i++)  

    {  

        for(j=0;j<=m;j++)  

            printf("=",c[i][j]);  

        printf("/n");  

    }  

    Trackback(c,w,m,n);//找最优解  

    for(i=1;i<=n;i++)  

        cout<<x[i]<<" ";  

    cout<<endl;  

    return 0;  

}  

  

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