解题思路
一道假的dp,dp[i]表示前i个产品花费最小
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
const int MAXN = 1e5 + 5;
int price[MAXN], dp[MAXN];
int main()
{
int T;
cin >> T;
while (T--)
{
int n, p, k;
cin >> n >> p >> k;
for (int i = 1; i <= n; ++i)
{
cin >> price[i];
dp[i] = 0;
}
sort(price + 1, price + n + 1);
for (int i = 1; i <= n; ++i)
{
if (i < k)
{
dp[i] = dp[i - 1] + price[i];
}
else
{
dp[i] = min(dp[i - k] + price[i], dp[i - 1] + price[i]);
}
}
int ans = 0;
for (int i = n; i >= 1; --i)
{
if (dp[i] <= p)
{
ans = i;
break;
}
}
cout << ans << endl;
}
return 0;
}