zoukankan      html  css  js  c++  java
  • 01背包,求最大值

    View Code
    #include<IOSTREAM.H>
    #include <IOMANIP.H>
    #include <STRING.H>
    #include <STDLIB.H>
    #include <stdio.h>
    /************************************************************************/
    /* 0-1背包问题是一个经典的动态规划问题,问题定义如下:有n个物品,
    其重量分别为W={w1, w1, w3, ... wn},其价值分别为V={v1, v2, v3, .. vn}。
    现在要将这N个物品放入允许的最大重量为w的包中,问怎样选择物品能使包中的物品总价值最大。
    分析: 
    构建二维数组a[n][w],a[i][j]代表将1->i个物品放入允许的最大重量为j的包中,所能产生的最大总价值。
    初始时,令a[i][0]=0(i = 0->n), a[0][j]=0(j = 0->w)。
    计算a[i][j]时,可以分两种情况考虑:不将第i物品放入背包中,a[i][j]=a[i-1][j];
    如果j>=wi,则考虑将第i物品放入背包中,a[i][j] =  a[i-1][j-wi] + vi,之后a[i][j]等于两者中的较大值。
    可以在求a[i][j]的同时,记录其是否选择物品i,select[i][j],这样可以最终通过select数组求出所选择的物品。
    最终a[n][w]即为所求最大总价值。                                                                  
    */
    /************************************************************************/
    void main()
    {
        int N=5;
        int weight=6;
        int W[7]={0,2,2,1,1,1,2};
        int V[7]={0,4,3,3,3,2,4};
        
        int array[7][7];
        for (int i=0;i<7;i++)
        {
            array[i][0]=0;
        }
        for(int j=0;j<7;j++)
            array[0][j]=0;
        for (i=1;i<7;i++)
        {
            for (j=1;j<7;j++)
            {
                int temp1=array[i-1][j];
                int temp2=0;
                if(j-W[i]>=0)    temp2=array[i-1][j-W[i]]+V[i];
                array[i][j]=temp1>=temp2?temp1:temp2;
            }
        }
        i=6;j=6;
        while(i>0&&j>0)
        {
            if (array[i][j]==array[i-1][j])
            {
                i=i-1;
            }
            else
            {
                cout<<setw(3)<<i;
                j=j-W[i];i=i-1;
    
            }
        }
        cout<<endl;
        
        cout<<array[6][6]<<endl;
    }
  • 相关阅读:
    知识加油站
    markdown 使用
    今日计划
    继续继续
    我回来了
    2020/5/8
    2020/5/10
    明天一定要学习了
    入驻博客园
    this is a test
  • 原文地址:https://www.cnblogs.com/GoAhead/p/2751811.html
Copyright © 2011-2022 走看看