【洛谷习题】榨取kkksc03

题目链接:https://www.luogu.org/problemnew/show/P1855


 

好迷的一道题啊,难道是逼着我用二维滚动数组???一开始写最简单的三维顺推只有60分,改成二维倒推就A了?好玄啊!

这道题思路很简单,类比01背包,不过是费用变成了二维的。

 1 #include <cstdio>
 2 #include <algorithm>
 3 
 4 using namespace std;
 5 
 6 const int mmax = 205;
 7 
 8 int dp[mmax][mmax];
 9 
10 int main() {
11     int n, m, t;
12     scanf("%d%d%d", &n, &m, &t);
13     for (int i = 1; i <= n; ++i) {
14         int nt, nm;
15         scanf("%d%d", &nt, &nm);
16         for (int j = m; j >= nm; --j)
17             for (int k = t; k >= nt; --k)
18                 dp[j][k] = max(dp[j][k], dp[j - nm][k - nt] + 1);
19     }
20     printf("%d", dp[m][t]);
21     return 0;
22 }
AC代码

 

然而可爱的我怎么可能会不知道哪里错了呢(后来才知道)?

我用三维的时候,金钱、时间都是从花费开始枚举的,这就导致金钱时间不足的情况都成了0,但是应该继承没满足的情况。二维背包自然不会出现这种问题。

posted @ 2018-09-10 11:37  Mr^Kevin  阅读(115)  评论(0编辑  收藏  举报