• 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;
    }
  • 相关阅读:
    AOP
    关于zookeeper部署的个数
    Zookeeper 简介
    Java 正则表达式
    面试记录
    面试题
    Spring Framework官方文档翻译(中英文版)
    java知识巩固
    mysql sql记录
    redis入门
  • 原文地址:https://www.cnblogs.com/tonyyy/p/10436636.html
Copyright © 2020-2023  润新知