4978:宠物小精灵之收服

普通01背包再加一维

状态:d[i][j]代表:有i个球,j体力,最多能捕获多少精灵

状态转移:d[i][j]=max(d[i][j],d[i-num[k]][j-val[k]]+1);

k为精灵的编号,第k个精灵。

边界情况d[i][0]=d[0][j]=0,都初始化为0也行。

最后找到所剩的体力最大值判断d[N][i]==d[N][M],i是最少消耗的体力值

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxN=1000+5;
const int maxM=500+5;
int num[105],val[105];
int d[maxN][maxM];

int main()
{
    //freopen("in.txt","r",stdin);
    int N,M,K;
    while(cin>>N>>M>>K)
    {
        for(int i=0; i<K; i++)
            scanf("%d%d",&num[i],&val[i]);
        memset(d,0,sizeof(d));
        for(int k=0; k<K; k++)
        {
            for(int i=N; i>=num[k]; i--)
            {
                for(int j=M; j>=val[k]; j--)
                {
                    d[i][j]=max(d[i][j],d[i-num[k]][j-val[k]]+1);
                }
            }
        }
        int r;
        for(int i=0; i<=M; i++)
        {
            if(d[N][i]==d[N][M])
            {
                r=i;
                break;
            }
        }
        printf("%d %d\n",d[N][M],M-r);
    }
    return 0;
}

  

时间: 2024-10-20 13:54:49

4978:宠物小精灵之收服的相关文章

(动态规划)4978:宠物小精灵之收服

描述 宠物小精灵是一部讲述小智和他的搭档皮卡丘一起冒险的故事. 一天,小智和皮卡丘来到了小精灵狩猎场,里面有很多珍贵的野生宠物小精灵.小智也想收服其中的一些小精灵.然而,野生的小精灵并不那么容易被收服.对于每一个野生小精灵而言,小智可能需要使用很多个精灵球才能收服它,而在收服过程中,野生小精灵也会对皮卡丘造成一定的伤害(从而减少皮卡丘的体力).当皮卡丘的体力小于等于0时,小智就必须结束狩猎(因为他需要给皮卡丘疗伤),而使得皮卡丘体力小于等于0的野生小精灵也不会被小智收服.当小智的精灵球用完时,狩

宠物小精灵之收服

题目链接 总时间限制: 1000ms 内存限制: 65536kB 描述 宠物小精灵是一部讲述小智和他的搭档皮卡丘一起冒险的故事. 一天,小智和皮卡丘来到了小精灵狩猎场,里面有很多珍贵的野生宠物小精灵.小智也想收服其中的一些小精灵.然而,野生的小精灵并不那么容易被收服.对于每一个野生小精灵而言,小智可能需要使用很多个精灵球才能收服它,而在收服过程中,野生小精灵也会对皮卡丘造成一定的伤害(从而减少皮卡丘的体力).当皮卡丘的体力小于等于0时,小智就必须结束狩猎(因为他需要给皮卡丘疗伤),而使得皮卡丘体

【noi 2.6_4978】宠物小精灵之收服(DP)

题意:小智有N个精灵球,皮卡丘有M的初始体力,有K个野生小精灵.要收服尽可能多的野生小精灵,并使皮卡丘的剩余体力最大. 解法:01背包问题,增多一维来存第二个条件.f[i][j][k]表示抓前i个野生小精灵,用了j个精灵球,耗费了k的体力时能抓的最多的小精灵数.(我把[i]的那维简化掉了,PG里的m代替N,v代替M,n代替K.) 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include&l

宠物小精灵之收服 (二维01背包)

[题目链接] http://noi.openjudge.cn/ch0206/4978/ [算法] 做的第一道二维的背包问题,只需开的数组增加一维以正确表述每一个状态即可.本质还是多过程决策+最优子结构+无后效性. [代码] 1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,m,k,i,j,t,minm; 4 int v[1010],u[510],dp[1010][510]; 5 int main() 6 { 7 scanf(&q

AcWing 1022. 宠物小精灵之收服

在背包问题中,体积w与价值v是可以互逆的! 可以将\(f[i]\)表示为体积为\(i\)能装的最大价值, 也可以将\(f[i]\)表示为价值为\(i\)所需的最小体积. 两者等价,我们只需要选择范围较小的那维作为体积就可以了! 这直接影响到时空复杂度. 这题就是个案例. 算法1 (体力.精灵球数为费用.精灵数为价值) \(O(nmk)\) \(f[i][j]\)表示为体力为\(i\),精灵球数为\(j\)所收集到的最大精灵. 时间复杂度 差不多是\(5 * 10^7\)的级别. C++ 代码 #

2016.4.9 NOI codevs动态规划专练

1.NOI 最大子矩阵 1:最大子矩阵 总时间限制:  1000ms 内存限制:  65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的矩阵 0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2 的最大子矩阵是 9 2-4 1-1 8 这个子矩阵的大小是15. 输入 输入是一个N * N的矩阵.输入的第一行给出N (0 < N <= 100).再后面的若干行中,依次(首先从

30年职场生涯的感悟[转]

一个人最终成功与否,在多大程度上成功,也并不是最关键的,关键的是做正确的事情,并且把事情做好的能力. 职业生涯就像一场马拉松比赛 正常人大概要工作35年,这好比是一场马拉松比赛,和真正的马拉松比赛不同的是,这场比赛没有职业选手,每个人都只有一次机会.要知道,有很多人甚至坚持不到终点,只有少数人是跑过终点的,因此在刚开始的时候,去抢领先的位置并没有太大的意义. 职业生涯就像一场体育比赛,有初赛.复赛.决赛.初赛的时候大家都刚刚进社会,大多数都是实力一般的人,这时候努力一点认真一点很快就能让人脱颖而

耐心排序Patience Sorting

这个排序的关键在建桶和入桶规则上 建桶规则:如果没有桶,新建一个桶;如果不符合入桶规则那么新建一个桶 入桶规则:只要比桶里最上边的数字小即可入桶,如果有多个桶可入,那么按照从左到右的顺序入桶即可 举个例子,待排数组[6 4 5 1 8 7 2 3] 第一步,取数字6出来,此时一个桶没有,根据建桶规则1新建桶,将把自己放进去,为了表述方便该桶命名为桶1或者1号桶 第二步,取数字4出来,由于4符合桶1的入桶规则,所以入桶1,并放置在6上边,如下图2所示 第三步,取数字5出来,由于5不符合桶1的入桶规

下属有能力却不服管,你该怎么办?

(2016-06-06 15:03:57) 转载▼     这个话题,所有处在管理岗位的朋友们一定有这样的体会.当你手底下有一位能干的员工,他能够帮你解决很多问题,但是如果他经常跟你闹一些小别扭.小情绪,或者在某些场合顶撞你,会让你心里很不舒服.但如果是一个对你无关紧要的人,他跟你闹闹脾气.搞点小别扭,你可能无所谓就过去了. 可以感受到的是什么呢?这种有能力不听话的下属对我们来讲,是有特殊的含义的.实际上从我们接触到的企业和自己在经营过程中看到的问题,这背后反映的是管理人员心理上出了大问题.同时