蓝桥杯 ACwing 习题

https://www.acwing.com/problem/content/1049/‘

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110;
typedef long long LL;


int a[N];
int f[N][N]; // 表示的是从前 i 件物品中选 , sum % k 的余数是 j 的糖果的总数 

int main()
{
    int n , k;
    cin >> n >> k;
    
    for(int i = 1; i <= n ; i ++) cin >> a[i];
    
    // 初始化不用说 
    memset(f , -0x3f , sizeof f);
    f[0][0] = 0;
    
    for(int i = 1 ; i <= n ; i ++)
       for (int j = 0 ; j < k ; j ++)
         {
             f[i][j] = max(f[i - 1][j], f[i - 1][(j  + k - a[i] % k) % k] + a[i]); 
             // 要说的是这个地方就是 , 我们第二位枚举的是余数 , 一定不能超过 k 的 所以是 0 - k - 1
             // 其次 我们需要知道 j - a[i] 是否是 < 0 的 , 我们不知道所以需要我们转换一下
             // 就是将 j - a[i] 转换 到 > 0 < k  所以需要先将 a[i] % k 这样就把 a[i] 转换为 0 - k - 1之间了
             // 那么 j - (0 - k - 1) + k 一定是 > 0 的 , j - k + 1 + k = j + 1 > 0 所以成立
         }
    
    printf("%d" , f[n][0]);
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值