Pregunta: Quieres comprar regalos para tus amigos. Ahora tienes dos métodos de compra
. El primero es comprar un artículo al precio de una [i].
El segundo es elegir k artículos y gastar estos k El precio máximo de los artículos para obtener estos k artículos.
Ahora tiene la cantidad de dinero p. Pregunte cuántos regalos puede comprar como máximo.
Si desea obtener más regalos con menos dinero, definitivamente usaré mi derecho Para obtener k artículos,
ordene la
matriz de precios de artículos dp [i] para registrar el costo de comprar i artículos
sin usar el derecho a comprar
dp [i] = dp [i-1] + a [i];
use el derecho k Empaqueta
dp [i] = dp [ik] + a [i];
se obtiene la ecuación de transición de estado:
dp [i] = min (dp [i-1] + a [i], dp [ik] + a [i] );
Luego, después de atravesar, averigüe cuál es la i más grande que se puede comprar con p dinero y la producción 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;
}