暴力破解,只得一点分吧,我也没有优化,不过看到有的题解将问题转化为取余,然后优化了。
在此,用背包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