ABC 281 D
# AtCoder Beginner Contest 281 D
题意
从一个大小为N的数组中选择K个数,使得这K个数的和是D的最大倍数。
题解
有数据范围1<=K<=N<=100,D<=100可知,这是个简单dp.
nt n,m,K,D;
int f[110][110];
int a[110];
void solve()
{
//f[i][j][k]表示前i个数选取j个,和余数为k的最大值
//所求为f[n][K][0],x=a[i]%D;
//如果f[i-1][j-1][k-x]!=-1 f[i][j][k]=max(f[i][j][k],f[i-1][j-1][k-x]+a[i])
//else f[i][j][k]=f[i-1][j][k];
cin>>n>>K>>D;
memset(f,-1,sizeof(f));
for(int i=0;i<=n;i++) f[0][i]=0;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
{
int x=a[i]%D;
for(int j=min(i,K);j>=1;j--)
{
for(int k=D-1;k>=x;k--)
{
if(f[j-1][k-x]==-1) continue;
int tmp=(f[j-1][k-x]+a[i])%D;
if(tmp==k)
{
f[j][k]=max(f[j-1][k-x]+a[i],f[j][k]);
}
}
for(int k=x-1;k>=0;k--)
{
int d=(k-x+D)%D;
if(f[j-1][d]==-1) continue;
int tmp=(f[j-1][d]+a[i])%D;
if(tmp==k)
{
f[j][k]=max(f[j-1][d]+a[i],f[j][k]);
}
}
}
}
cout<<f[K][0]<<endl;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下