zoukankan      html  css  js  c++  java
  • HDU2159_二维完全背包问题

    HDU2159_二维完全背包问题

    输入有:经验,忍耐度,怪物种数,限制杀怪数 每一种怪物对应获得的经验值和消耗的耐久值

    输出:剩下的最大忍耐度

    限制:忍耐度,杀怪个数

    在这里把忍耐度看成背包的容量,杀怪个数限制作为第二维

    dp[i][j]表示在背包容量为i的时候,放了j件物品所产生的价值

    接下来就是循环问题

    先遍历每一个物品(怪物)  i

      然后遍历体积(耐久值)正序遍历——完全背包   j

        然后遍历杀怪的个数(正序遍历)完全背包   k

          得出dp[j][k]  = max(dp[j][k],dp[j-cost[i]][k-1] + data[i]);

          在这里要记录一下,要保留最大的耐久值,我们就要存储,当dp[j][k]所产生的经验值大于等于升级所需要的经验值时小号的最小耐久值

    最后一减就ok了

    #include <iostream>
    #include <cstdio>
    #include <string.h>
    #include <cmath>
    #define inf 0xffffff
    using namespace std;
    const int maxn = 200;
    int dp[maxn][maxn];//dp[i][j]表示忍耐度为i的情况下杀j个怪兽所获得的经验
    int data[maxn];
    int cost[maxn];
    int main()
    {
        int e,V,n,limit;
        while(~scanf("%d%d%d%d",&e,&V,&n,&limit))
        {
            for(int i = 0;i < n;i++)
                scanf("%d %d",&data[i],&cost[i]);
            memset(dp,0,sizeof(dp));
            int res = inf;
            for(int i = 0;i < n;i++)//遍历物品
                for(int j = cost[i];j <= V;j++)//完全背包层层递推
                    for(int k = 1;k <= limit;k++)//不管当前这只,管当前这只
                    {
                        dp[j][k] = max(dp[j][k],dp[j-cost[i]][k-1] + data[i]);
                        if(dp[j][k] >= e)res = min(res,j);
                    }
            if(res == inf)cout<<-1<<endl;
            else cout<<V - res<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    影响stm32仿真的因素
    DMA 如何查看它有没有传输完成 传输完成再开启
    keil出错总结
    一个例子讲解wav头文件 stm32声音程序 录音和播放 wav
    前期绑定 vs 后期绑定
    抽象类 VS 接口 (3)
    抽象类 VS 接口(1)
    封装之--JAVA中的访问修饰符(区别于.NET)
    【DP专题】——洛谷P1156垃圾陷阱
    MySql
  • 原文地址:https://www.cnblogs.com/DF-yimeng/p/9345492.html
Copyright © 2011-2022 走看看