HDU-2602 Bone Collector——01背包

首先输入一个数字代表有n个样例 

接下来的三行

第一行输入n  和  v,代表n块骨头,背包体积容量为v。

第二行输入n块骨头的价值

第三行输入n块骨头的体积

问可获得最大的价值为多少

核心:关键在于dp【j】=max(dp[j],dp[j-w[i]]+v[i]) 的状态转移!!

背包最多能装下题目中所给的骨头,如体积为10的背包能装下体积分别为5和4的体积一块,

但最后其实背包还剩余了体积为1的位置没有讨论,则通过 j-- 进行剩余补充讨论。

在体积不断减小的同事每次都对目前这个这个体积(目前状态)下最多能装多少已知的骨头,

并通过对比之前的数据(上一次的状态)取较大值。即可获得该目标体积的最大值!!

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <stdio.h>
#define ll long long
using namespace std;
int a[1005];
int b[1005];
int dp[1005];
int main()
{
    int m,n,k,t;
    cin>>t;
    while(t--)
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(dp,0,sizeof(dp));
        cin>>m>>n;
        for(int i=1;i<=m;i++)
        {
            cin>>a[i];
        }//价值
        for(int i=1;i<=m;i++)
        {
            cin>>b[i];
        }//体积
        for(int i=1;i<=m;i++)
        {
            for(int j=n;j>=0;j--)
            {
                if(j>=b[i])
                    dp[j] = max(dp[j],dp[j-b[i]]+a[i]);
            }
        }
        cout<<dp[n]<<endl;
    }
    return 0;
}

 

posted @ 2019-02-26 13:12  Tonyyy  阅读(146)  评论(0编辑  收藏  举报