hdu 2602 Bone Collector

  终于开始做自己一直不敢碰的dp了,内心颇不平静。很久以前看过的背包九讲也没什么印象了。这个题错了四次。之前老师有说过看到dp不要把它想成dp,要按照数学归纳的路子来。先来个最初的归纳假设,如果过弱再加强归纳假设,如果过强,则在松一些。说服自己尽量这么干,毕竟刚开始真的会比较困难。要找到最初的归纳假设就相当困难,何况加强或者松弛,于我,比较难。

  写着题时脑子里面一直恍恍惚惚的,恐惧心理已经完全打败了我。四次错在v不是从0开始,哎。该死。

  

View Code
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>

using namespace std;

const int maxn=1001;

struct BONE
{
    int val;
    int vol;
}bone[maxn];

int n,v;
void init()
{
    scanf("%d %d",&n,&v);
    for(int i=1;i<=n;i++)
        scanf("%d",&bone[i].val);
    for(int i=1;i<=n;i++)
        scanf("%d",&bone[i].vol);
}

int dp[maxn][maxn];
void DP()
{
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=v;j++)
        {
            if(j>=bone[i].vol)
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-bone[i].vol]+bone[i].val);
            else
                dp[i][j]=dp[i-1][j];
        }
    }
    printf("%d\n",dp[n][v]);
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        init();
        DP();
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/RainingDays/p/2840909.html