阿里笔试 4.24 求指导

题意:给定一个n个元素的数组和m,从数组中挑选一个子序列,子序列的和对m取余最大,输出这个最大的余数。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int n;
    long m;
    cin >> n;
    cin >> m;
    vector<long> vec(n);
    long sum = 0;
    for(int i = 0; i < n; i++) {
        cin >> vec[i];
        vec[i] = vec[i] % m; //数组存求余后的值
        sum += vec[i];
    }
    if(sum < m) {
        cout << sum;
        return 0;
    }
    vector<long> dp(n); //dp[i]的意思是以数组i结尾的子序列的最大余数
    dp[0] = vec[0];
    for(int i = 1; i < n; i++) {
        dp[i] = dp[i - 1]; //不拿
        for(int j = 1; j <= i; j++) {
            dp[i] = max(dp[i], (vec[i]+dp[i-j]) % m);//拿
        }
    }
    cout << dp[n - 1];
    return 0;
}
自测的样例没问题
输入:
6 11
4 12 3 7 6 2
输出:
10
求指点!


#阿里笔试##阿里巴巴##笔试题目#
全部评论
因为是取模,我的思路是把所有数字加起来对m取模 取名为sum,sol =sum,然后每次找到刚好比sum大一点得值把他减掉-。-再对比sol和sum
点赞 回复 分享
发布于 2020-04-27 18:24
最优子结构不对,迭代过程中dp[i-j]+vec[i]不一定是数组前i-j个数与vec[i]构成的数组的最优解
点赞 回复 分享
发布于 2020-04-25 01:15
。。我觉得就是背包问题,挨着拿选择要还是不要。
点赞 回复 分享
发布于 2020-04-24 11:49

相关推荐

陆续:不可思议 竟然没那就话 那就我来吧 :你是我在牛客见到的最美的女孩
点赞 评论 收藏
分享
评论
1
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务