传送门:一道神奇的dp题
这是一道有点不像dp的dp,题意是给你n个物品,每个物品的价值为ai , 然后你可以用一个叫报价的操作,买掉这个就可以拿走比他价值小的任何一个物品,任何你有m个钱, 需要求出来你最多能买多少个物品,我们可以把他的价值排序,然后用一个二维dp数组去维护, f[i]][1]表示不报价所需的买下1-n的所有的物品所需的价钱,f[i][0]表示报价要买下1-n中所有物品的价钱,f[i][1] =a[i] + min(f[i-1][0],f[i-1][1]) , f[i][0] = a[i] + min(f[i-2][0],f[i-2][1]), 推出来状态转移方程之后就变得很简单了
题目:
ac 代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 2e5 + 5;
typedef long long LL;
LL a[N];
LL f[N][2];
int main()
{
int t;
cin >> t;
while(t--)
{
LL n , m , k ;
cin >> n >> m >> k ;
for(int i = 1; i <= n ; i ++)cin >> a[i];
sort(a+1,a+1+n);
LL ans = 0;
f[1][0] = f[1][1] = a[1];
if(m >= a[1])ans = 1;
for(int i = 2 ; i <= n ; i ++)
{
f[i][0] = a[i] + min(f[i-2][0],f[i-2][1]);
f[i][1] = a[i] + min(f[i-1][0],f[i-1][1]);
if(f[i][0] <= m || f[i][1] <= m)ans = i;
}
cout << ans <<endl;
}
}