蓝桥杯 倍数问题

暴力破解,只得一点分吧,我也没有优化,不过看到有的题解将问题转化为取余,然后优化了。

在此,用背包dp求解更好

#include<bits/stdc++.h>
using namespace std;
//可以转化为01背包问题,即在i个数中找出j个数的最优解
//可以记一个小技巧,将倍数问题从余数思考
//一般状态表示的时候,把限制放到维数里面,一般有几个限制,就用几维的状态表示。
const int N=1010;
vector<int>a[N];//用vector数组,这个小技巧以后也要记着
int f[4][N];
int n,m;
int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        a[x%m].push_back(x);
    }
    memset(f,-0x3f,sizeof f);//为什么初始化为-1会报错。
    f[0][0]=0;
    for(int i=0;i<m;i++)
    {
        //sort(a[i].begin(),a[i].end(),greater<int>());和以下两句等价
        sort(a[i].begin(),a[i].end());
        reverse(a[i].begin(),a[i].end());  //转化为从大到小的
        for(int u=0;u<3&&u<a[i].size();u++)
        {
            int x=a[i][u];
            for(int j=3;j>0;j--)
            {
                for(int k=0;k<m;k++)
                {
                    f[j][k]=max(f[j][k],f[j-1][(k-x%m+m)%m]+x);
                }
            }
        }
    }
    cout<<f[3][0]<<endl;
    return 0;
}

主要参考这个博主

版权声明:本文为CSDN博主「lies@」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ironman321/article/details/105419494

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃代码的航航

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值