1017

1.题目编号:
1017
2.简单题意:
经典0-1背包
3.解题思路形成过程:
0.0思路上网上找的
不过get到了很重要的递归表达式
f[i][j]=max(f[i-1][j-volume(要大于零)]+value,f[i-1][j]);
http://www.cnblogs.com/daoluanxiaozi/archive/2012/05/06/2486105.html
这个网址里有个图,那个图帮助理解递推表达式很有效
是先形成最下面一行
在形成倒数第二行的时候,放入这个物品
那么加上价值(也就是+value),但是体积要变小,用剩下的体积找一个能放的最大价值加上(也就是f[i-1][j-volume)

4.感想
这题感觉好像测试样例有问题
貌似有体积是零但是有价值的骨头。。
问题在注释标记的那行
5.AC代码

#include<iostream>
#include<string.h>
#include<stdio.h>
int max(int a,int b)
{
    if(a>b) return a;
    else    return b;
}
using namespace std;
int main()
{
    int package[1009][1009];
    int volume[1009];
    int value[1009];

    int cases;
    cin>>cases;
    while(cases--)
    {
        memset(package,0,sizeof(package));
        memset(volume,0,sizeof(volume));
        memset(value,0,sizeof(value));
        int N;//number of bones
        int V;//volume of bag

        cin>>N>>V;

        for(int i=1;i<=N;i++)
        {
            cin>>value[i];//value of each bone;
        }

        for(int i=1;i<=N;i++)
        {
            cin>>volume[i];//volume of each bone;
        }

        //前a个物品放入容积为b的包里,价值的最大值
        for(int a=1;a<=N;a++)
        for(int b=0;b<=V;b++)
        {
 /* b的值必须从0开始,但是我的数组已经清零,如果所有体积是0的价值都是0的话代码不该出问题的 */
            if(b-volume[a]>=0)
                package[a][b]=max(package[a-1][b-volume[a]]+value[a],\
                    package[a-1][b]);
            else
                package[a][b]=package[a-1][b];
        }
        cout<<package[N][V]<<endl;
    }
}

你可能感兴趣的:(1017)