算法学习之动态规划(二)

例题一

神奇的口袋

有一个神奇的口袋,总的容积为40,用这个口袋可以变出一些物品,这些物品的体积分别为a[1],a[2],a[3]…a[n].John可以从这些物品中选择一些,如果选出的物体的总体积为40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。

递推的做法
#include 

#define VOLUME_MAX 40

using namespace std;
int ways[VOLUME_MAX+1];
int objects[]={10,9,7,4,9,5,5,1,7,3,11};


int main() {
    int size= sizeof(objects)/sizeof(int);
    for(int i=1;i<=VOLUME_MAX;i++)
    {
        if(objects[0]==i)
            ways[i]=1;
        else
            ways[i]=0;
    }
    //易错点
    ways[0]=1;
    for(int i=1;i<size;i++)
    {
        for (int j = VOLUME_MAX; j >0; j--)
        {
            //如果剩余容积大于第i+1个物品的体积,那么可以选择拿取或者不拿取这种物品
            if (j >=objects[i])
                ways[j] = ways[j - objects[i]] + ways[j];
        }
    }
    cout<<ways[VOLUME_MAX]<<endl;

    return 0;
}

递归的做法
#include 

#define VOLUME_MAX 40
#define OBJECT_MAX 40

using namespace std;
int objects[]={10,9,7,4,9,5,5,1,7,3,11};
int count(int volume,int num)
{
    if(volume==0)
        return 1;
    if(num<=0)
        return 0;
    if(volume>=objects[num-1])
        return count(volume-objects[num-1],num-1)+count(volume,num-1);
    else
        return count(volume,num-1);


}

int main() {
    int size= sizeof(objects)/sizeof(int);
    cout<<count(40,size)<<endl;
    return 0;
}

例题二

0-1背包问题

有N件物品和一个容积为M的背包,第i件物品的体积w[i],价值为d[i].求解将哪些物品装入背包可以使得价值总和最大。每种物品只有一件,可以选择放或者不放(N<=3500,M<=13000)

在这里插入代码片
```#include <iostream>
#include 

#define VOLUME_MAX 40

using namespace std;
int most_expensive[VOLUME_MAX+1];
int objects[]={10,9,7,4,9,5,5,1,7,3,11};
int prices[]={9,7,4,9,5,5,2,7,3,10,11};


int main() {
    int size= sizeof(objects)/sizeof(int);
    for(int i=1;i<=VOLUME_MAX;i++)
    {
        //边界条件,当只有一个物体时,分能装下与不能装下两种
        if(objects[0]<=i)
            most_expensive[i]=prices[0];
        else
            most_expensive[i]=0;
    }
    most_expensive[0]=0;

    for(int i=1;i<size;i++)
        {
        for (int j = VOLUME_MAX; j >0; j--)
        {
            //如果剩余容积大于第i+1个物品的体积,那么可以选择拿取或者不拿取这种物品
            if (j>=objects[i])
                most_expensive[j] = max(most_expensive[j - objects[i]] + prices[i],most_expensive[j]);
        }
    }
    cout<<most_expensive[VOLUME_MAX]<<endl;

    return 0;
}


你可能感兴趣的:(c++,算法)