Pergunta: Você quer comprar presentes para seus amigos. Agora você tem dois métodos de compra
. O primeiro é comprar um item pelo preço de a [i].
O segundo é escolher k itens e gastar este k O preço máximo dos itens para obter esses k itens.
Agora você tem a quantia de dinheiro p. Pergunte quantos presentes você pode comprar no máximo.
Se você quiser receber mais presentes com menos dinheiro, então com certeza usarei meu direito Para obter k itens,
solicite a
matriz de preços de itens dp [i] para registrar o custo de compra de i itens
sem usar o direito de comprar
dp [i] = dp [i-1] + a [i];
use o k certo Empacotar juntos
dp [i] = dp [ik] + a [i]; a
equação de transição de estado é obtida:
dp [i] = min (dp [i-1] + a [i], dp [ik] + a [i] );
Depois de percorrer, descubra qual é o maior i que pode ser comprado por p dinheiro e pela produção i
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAXN = 2e5+7;
int a[MAXN],dp[MAXN];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,p,k;
scanf("%d%d%d",&n,&p,&k);
for(int i = 1;i <= n;i ++){
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
for(int i = 1;i <= n;i ++)
{
dp[i] = dp[i-1]+a[i];
if(i >= k)
{
dp[i] = min(dp[i],dp[i-k]+a[i]);
}
}
int ans = 0;
for(int i = 1;i <= n;i ++)
{
if(p >= dp[i])
{
ans = max(ans,i);
}
}
printf("%d\n",ans);
}
return 0;
}