HDU 2159 FATE【二维完全背包】

题意:xhd玩游戏,还需要n个经验值升级,还留有m的忍耐度,但是他最多打s只怪,给出k个怪的经验值a[i],以及消耗的忍耐度b[i],问xhd能不能升级--

因为有两个限定,忍耐度,和最多打s只怪(即没打一只怪,要消耗1),又因为每只怪有无数只,所以是二维的完全背包--

后来写了发现不对(过了样例一直WA)--又翻了题解发现是循环跳出没有弄对,要dp[i][j]>=n的同时且j==s(因为要刚好打s只怪--)

发现把每只怪的数量当1也能过(自己就是这样想的---55555)

每只怪只有一只水过版本--

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define maxn 1005
 6 using namespace std;
 7 int dp[maxn][maxn],a[maxn],b[maxn];
 8 int main()
 9 {
10     int i,j,k,n,m,s,t;
11     while(scanf("%d %d %d %d",&n,&m,&k,&s)!=EOF&&n&&m&&k&&s)
12     {
13         for(i=1;i<=k;i++) scanf("%d %d",&a[i],&b[i]);
14         memset(dp,0,sizeof(dp));
15         for(i=1;i<=m;i++)
16         {
17             for(j=1;j<=s;j++)
18             {
19                 for(t=1;t<=k;t++)
20                     if(i>=b[t]&&j>=1)
21                     dp[i][j]=max(dp[i][j],dp[i-b[t]][j-1]+a[t]);
22             }
23             if(dp[i][s]>=n) break;
24         }
25         if(i>m) printf("-1\n");
26         else
27         printf("%d\n",m-i);
28     }
29 }

标准无数只怪版本--

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define maxn 1005
 6 using namespace std;
 7 int dp[maxn][maxn],a[maxn],b[maxn];
 8 int main()
 9 {
10     int i,j,k,n,m,s,t;
11     while(scanf("%d %d %d %d",&n,&m,&k,&s)!=EOF&&n&&m&&k&&s)
12     {
13         for(i=1;i<=k;i++) scanf("%d %d",&a[i],&b[i]);
14         memset(dp,0,sizeof(dp));
15         for(i=1;i<=m;i++)
16         {
17             for(j=1;j<=s;j++)
18             {
19                 for(t=1;t<=k;t++)
20                 {
21                     int h=1;
22                     while(i>=h*b[t]&&j>=h)
23                     {
24                     dp[i][j]=max(dp[i][j],dp[i-h*b[t]][j-h]+h*a[t]);
25                     h++;
26                     }
27                     }
28             }
29             if(dp[i][s]>=n) break;
30         }
31         if(i>m) printf("-1\n");
32         else
33         printf("%d\n",m-i);
34     }
35 }

时间: 2024-12-23 18:35:15

HDU 2159 FATE【二维完全背包】的相关文章

HDU 2159 FATE (二维多重背包)

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

HDU 2159 FATE (二维完全背包)

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

hdu 2159 FATE 二维费用的完全背包

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159 #include <cstdio> #include <cstdlib> #include <ctime> #include <iostream> #include <cmath> #include <cstring> #include <algorithm> #include <stack> #includ

HDU 2159 FATE (二维背包)

题意:中文题. 析:dp[i][j] 已经杀了 i 个怪兽,已经用了 j 体积,所能获得的最大经验值,这个和一维的差不多,只是加一维而已. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iost

[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;

杭电 2159 fate(二维背包费用问题)

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

HDU 2159 FATE(二维完全背包)

中文题目就不用解释了   就是裸的二维完全背包 d[i][j]表示消耗i忍耐杀j个怪最多可获得的经验  然后就用完全背包来做了  二维背包背包不过是多了一重循环 <span style="font-family:Arial Black;">#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 105; int ma

HDU 2159 FATE(二维全然背包)

中文题目就不用解释了   就是裸的二维全然背包 d[i][j]表示消耗i忍耐杀j个怪最多可获得的经验  然后就用全然背包来做了  二维背包背包只是是多了一重循环 <span style="font-family:Arial Black;">#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 105; int ma

HDU 2159 FATE【二维多重背包】

大意:二维多重背包 分析:二维多重背包 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 7 const int maxn = 105; 8 int dp[maxn][maxn]; 9 int a[maxn], b[maxn]; 10 11 int main() { 12 int n,

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