hdu2159 二维02bag

设f[i][j]为杀第j只怪时耐久度为i的最大经验值

完全背包类型:有N种物品和一个容量为V 的背包,每种物品都有无限件可用。放入第i种物品的耗费的空间是Ci,得到的价值是Wi。

求解:将哪些物品装入背包,可使这些物品的耗费的空间总和不超过背包容量,且价值总和最大。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
const int maxn=110;

int a[maxn],b[maxn];
int f[maxn][maxn];//f[i][j]表示杀第j只怪时耐久度为i的最大经验值

int main()
{
    int n,m,k,s,i,j,z;

    while (scanf("%d%d%d%d",&n,&m,&k,&s)==4)
    {
        memset(f,0,sizeof (f));

        for (i=1;i<=k;i++)
            scanf("%d%d",&a[i],&b[i]);
        for (i=1;i<=k;i++)//从第1个怪到第k个怪
        {
            for (j=1;j<=m;j++)//耐久度从1到m,耐久度为0时经验必为0
            {
                int temp=j/b[i];//对于第i种怪以耐久度限制最多杀temp只
                for (z=1;z<=min(s,temp);z++)//杀1-min(temp,s)只怪,杀0只怪经验必为0
                {
                    f[j][z]=max(f[j][z],f[j-1][z]);//不能添加f[j][z]=max(f[j][z-1],f[j][z]),因为z是杀怪数量
                    f[j][z]=max(f[j-b[i]][z-1]+a[i],f[j][z]);//值为如果杀了这只怪和不杀这只怪的最大经验值
                }
            }
        }

        int ans=999999;
        for (i=0;i<=m&&ans==999999;i++)
        {
            for (j=0;j<=s;j++)
            {
                if (f[i][j]>=n)
                {
                    ans=i;
                    break;
                }
            }
        }

        if (ans==999999)
            cout<<-1<<endl;
        else
            cout<<m-ans<<endl;

    }

    return 0;
}
时间: 2024-10-29 02:01:01

hdu2159 二维02bag的相关文章

HDU2159 二维费用背包

题目链接:FATE 状态转移方程: dp[ren][num] =max(dp[ren-耐久值][num-1]+ 经验值,dp[ren][num]) dp表示:当前忍耐度ren下杀敌数为num的经验值 枚举分别枚举 所有怪物种类.耐久度.杀怪数 最后在从小到达枚举消耗的耐久度即可 #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <

HDU2159 二维完全背包

FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 12533    Accepted Submission(s): 5932 Problem Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级.现在的问

HDU-2159 二维背包

最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级.现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度.当忍耐度降到0或者0以下时,xhd就不会玩这游戏.xhd还说了他最多只杀s只怪.请问他能升掉这最后一级吗? Input输入数据有多组,对于每组数据第一行输入n,m,k,s(0 < n,m,k,s < 100)四个正

hdu2159二维背包

题目连接 背包九讲----完全背包 有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 基本思路 这个问题非常类似于01背包问题 ,所不同的是每种物品有无限件.也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件.取1件.取2件--等很多种.如果仍然按照解01背包时的思路,令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值.仍然可以按照

hdu2159 FATE 二维背包

感觉用背包去想反而麻烦..就是一个递推 #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <map> #define inf 0x3f3f3f3f #define ll __int64 us

hdu2159 FATE 二维的完全背包

//这题典型的二维背包问题,因为题目说了每种怪的数量无限 //先开始的时候我想定义一个三维的dp,dp[i][j][k]表示前i种 //怪杀死j只剩余耐久点为dp[i][j][k]经验的最大值,然后状态 //方程就可以得到为dp[i][j][k] = max (dp[i-1][j][k],dp[i][j-1][k-b[i]]+a[i]); //这和完全背包的方程同出一辙,只是最后的答案我却不太清楚怎么找大, //最后看了一下题解,原来我的想法是对的,但最终的结果只要找到满足条件的最大的j就可以啦

B 二维背包+完全背包 Hdu2159

<span style="color:#3333ff;">/* ------------------------------------------------------------------------------------------------ author : Grant Yuan time : 2014.7.19 aldorithm: 二维背包+完全背包 ----------------------------------------------------

[hdu2159]FATE二维多重背包(背包九讲练习)

解题关键:二维约束条件,只需加一维状态即可. 转移方程:$f[j][k] = \max (f[j][k],f[j - w[i]][k - 1] + v[i])$ 1 #include<bits/stdc++.h> 2 #define inf 0x3f3f3f3f 3 using namespace std; 4 typedef long long ll; 5 int w[122],v[122]; 6 int dp[122][122]; 7 int main(){ 8 int n,m,k,s;

D - FATE HDU-2159 FATE 二维背包

D - FATE Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级.现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的