背包问题动态规划法.docx

上传人:b****2 文档编号:2065722 上传时间:2022-10-26 格式:DOCX 页数:10 大小:48.37KB
下载 相关 举报
背包问题动态规划法.docx_第1页
第1页 / 共10页
背包问题动态规划法.docx_第2页
第2页 / 共10页
背包问题动态规划法.docx_第3页
第3页 / 共10页
背包问题动态规划法.docx_第4页
第4页 / 共10页
背包问题动态规划法.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

背包问题动态规划法.docx

《背包问题动态规划法.docx》由会员分享,可在线阅读,更多相关《背包问题动态规划法.docx(10页珍藏版)》请在冰豆网上搜索。

背包问题动态规划法.docx

背包问题动态规划法

0/1背包问题

                        

                       

 1.问题描述

                              

                            

          给定一个载重量为m,n个物品,其重量为wi,价值为vi,1<=i<=n,要求:

把物品装入背包,并使包内物品价值最大

                                 

                             

2.问题分析

                              

                             

         在0/1背包问题中,物体或者被装入背包,或者不被装入背包,只有两种选择。

                       

        循环变量i,j意义:

前i个物品能够装入载重量为j的背包中

        (n+1)*(m+1)数组value意义:

value[i][j]表示前i个物品能装入载重量为j的背包中物品的最大价值

        若w[i]>j,第i个物品不装入背包

        否则,若w[i]<=j且第i个物品装入背包后的价值>value[i-1][j],则记录当前最大价值(替换为第i个物品装入背包后的价值)

           

         计算最大价值的动态规划算法如下:

                              

    //计算

    for(i=1;i

    {

        for(j=1;j

        {

            //w[i]>j,第i个物品不装入背包

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

            //w[i]<=j,且第i个物品装入背包后的价值>value[i-1][j],则记录当前最大价值

            int temp=value[i-1][j-w[i]]+v[i];

            if(w[i]<=j && temp>value[i][j])

                value[i][j]=temp;

        }

    }

                        

                    

     即该段程序完成以下n个阶段:

    1:

只装入1个物品,确定在各种不同载重量的背包下,能够得到的最大价值

    2:

装入2个物品,确定在各种不同载重量的背包下,能够得到的最大价值

    。

    n:

以此类推,装入n个物品,确定在各种不同载重量的背包下,能够得到的最大价值

                        

                     

3.问题求解

                  

              

     确定装入背包的具体物品,从value[n][m]向前逆推:

          若value[n][m]>value[n-1][m],则第n个物品被装入背包,且前n-1个物品被装入载重量为m-w[n]的背包中

          否则,第n个物品没有装入背包,且前n-1个物品被装入载重量为m的背包中

     以此类推,直到确定第一个物品是否被装入背包为止。

逆推代码如下:

              

    //逆推求装入的物品

    j=m;

    for(i=row-1;i>0;i--)

    {

        if(value[i][j]>value[i-1][j])

        {

            c[i]=1;

            j-=w[i];

        }

    }

                                                      

                          

4.代码如下

                         

                        

     输入数据及输出数据均在文件中。

     输入数据格式:

          nm

           w1 w2 ...wn

           v1v2...vn

     输出数据格式:

          maxValue

          icount           //i表示物品编号,count表示该物品被选中次数

          ...

/************************************************************************

 * 0/1背包问题求解 (visual studio 2005)

 * 给定一个载重量为m,及n个物品,其重量为wi,价值为vi,1<=i<=n

 * 要求:

把物品装入背包,并使包内物品价值最大

 ************************************************************************/

#include 

#include 

#include 

#define FILENAMELENGTH 100

class CBeibao

{

public:

    int m_nNumber;        //物品数量

    int m_nMaxWeight;    //最大载重量

    int *m_pWeight;        //每个物品的重量

    int *m_pValue;        //每个物品的价值

    int *m_pCount;        //每个物品被选中的次数

    int m_nMaxValue;    //最大价值

public:

    CBeibao(const char *filename);

    ~CBeibao();

    

    int GetMaxValue();

    int GetMaxValue(int n,int m,int *w,int *v,int *c);

    void Display(int nMaxValue);

    void Display(int nMaxValue,const char *filename);

};

//读入数据

CBeibao:

:

CBeibao(const char *filename)

{

    FILE *fp=fopen(filename,"r");    

    if(fp==NULL)

    {

        printf("can not open file!

");

        return;    //exit(0);

    }

    //读入物品数量和最大载重量

    fscanf(fp,"%d%d",&m_nNumber,&m_nMaxWeight);

    m_pWeight=new int[m_nNumber+1];

    m_pValue=new int[m_nNumber+1];

    m_pWeight[0]=0;

    //读入每个物品的重量

    for(int i=1;i<=m_nNumber;i++)

        fscanf(fp,"%d",m_pWeight+i);

    m_pValue[0]=0;

    //读入每个物品的价值

    for(int i=1;i<=m_nNumber;i++)

        fscanf(fp,"%d",m_pValue+i);

    //初始化每个物品被选中次数为0

    m_pCount=new int[m_nNumber+1];

    for(int i=0;i<=m_nNumber;i++)

        m_pCount[i]=0;

    fclose(fp);

}

CBeibao:

:

~CBeibao()

{

    delete[] m_pWeight;

    m_pWeight=NULL;

    delete[] m_pValue;

    m_pValue=NULL;

    delete[] m_pCount;

    m_pCount=NULL;

}

/************************************************************************

 * 动态规划求出满足最大载重量的最大价值

 * 参数说明:

n:

物品个数

 *           m:

背包载重量

 *           w:

重量数组

 *           v:

价值数组

 *           c:

是否被选中数组

 * 返回值:

最大价值

 ************************************************************************/

int CBeibao:

:

GetMaxValue(int n,int m,int *w,int *v,int *c)

{

    int row=n+1;

    int col=m+1;

    int i,j;    //循环变量:

前i个物品能够装入载重量为j的背包中

    //value[i][j]表示前i个物品能装入载重量为j的背包中物品的最大价值

    int **value=new int*[row];

    for(i=0;i

        value[i]=new int[col];

    //初始化第0行

    for(j=0;j

        value[0][j]=0;

    //初始化第0列

    for(i=0;i

        value[i][0]=0;

    //计算

    for(i=1;i

    {

        for(j=1;j

        {

            //w[i]>j,第i个物品不装入背包

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

            //w[i]<=j,且第i个物品装入背包后的价值>value[i-1][j],则记录当前最大价值

            int temp=value[i-1][j-w[i]]+v[i];

            if(w[i]<=j && temp>value[i][j])

                value[i][j]=temp;

        }

    }

    //逆推求装入的物品

    j=m;

    for(i=row-1;i>0;i--)

    {

        if(value[i][j]>value

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1