HDU2159 二重完全背包

和普通的完全背包不同的地方时多了物品选取的限制,因此需要增加一维

dp[i][j][k]表示前i种物品,选取j个放入容量为k的背包中所能得到的最大价值

这里和一维的背包一样可以利用滚动数组省略一维即

dp[i][j] 表示前选取i个放入容量为j的背包所能得到的最大价值

dp[i,j] = max(dp[i,j],dp[i-1][j-w[k]]+v[k]);

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <string>
 4 #include <algorithm>
 5 #include <iostream>
 6 using namespace std;
 7 #define INF 0x3fffffff
 8 const int maxn = 105;
 9 const int maxv = 105;
10 int dp[maxv][maxn],w[maxn],v[maxn];
11 int main()
12 {
13    //freopen("in.txt","r",stdin);
14     int n,m,k,s;
15     while(cin>>n>>m>>k>>s)
16     {
17         for(int i = 1;i<=k;++i)
18             scanf("%d%d",v+i,w+i);
19         memset(dp,0,sizeof(dp));
20         int flag = 0,ans = -1;
21         for(int j = 0;j<=m;++j)
22         {
23             for(int i = 1;i<=s;++i)
24             {
25                 for(int x = 1;x<=k;++x)
26                     if(j>=w[x]){
27                             dp[i][j] = max(dp[i][j],dp[i-1][j-w[x]]+v[x]);
28                             if(dp[i][j]>=n){flag = 1;ans = j;break;}
29                     }
30                 if(flag)break;
31             }
32             if(flag)break;
33         }
34         if(flag)printf("%d\n",m-ans);
35         else puts("-1");
36     }
37     return 0;
38 }
时间: 2024-10-09 22:13:33

HDU2159 二重完全背包的相关文章

HDU FATE (完全背包+有限取次)(二重费用背包)

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

hdu2159二维背包

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

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 研发费用背包

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

RQNOJ 202 奥运火炬登珠峰:01背包

题目链接:https://www.rqnoj.cn/problem/202 题意: 登珠峰需要携带a(L)O2和t(L)N2. 有n个气缸可供选择.其中第i个气缸能装下a[i](L)O2和t[i](L)N2,气缸重量为w[i]. 问你在满足需求的前提下,最小的气缸总重量为多少. 题解: 二重01背包. 表示状态: dp[i][j][k]表示考虑到第i个气缸(还没选),已经能装下j(L)O2和k(L)N2. dp[i][j][k] = 此时的最小总重量 找出答案: min dp[i][j][k]

【日常学习】【背包DP】codevs1014 装箱问题题解

转载请注明出处 来自CSDN用户ametake 题目来自NOIP2011PJ4 上题目 题目描述 Description 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. 输入描述 Input Description 一个整数v,表示箱子容量 一个整数n,表示有n个物品 接下来n个整数,分别表示这n 个物品的各自体积 输出描述 Output Descr

HDU 2159 FATE (完全背包+有限尚需时日)()双费背包

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

hdu2159完全背包

md心里有事的时候不能写题操 FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 13285    Accepted Submission(s): 6292 Problem Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过

FATE---hdu2159(二重背包)

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