题解:ABC281D - Max Multiple

题解:ABC281D - Max Multiple

·题目

链接:Atcoder。

链接:洛谷。

·难度

算法难度:B。

思维难度:A。

调码难度:B。

综合评价:普及+/提高。

·算法

动态规划。

·思路

状态:f[i][j][k]表示前i个物品,选取j个,使得总和除以d的余数为k,此时总和的最大值。

初值:f[i][0][0]=0(取0个余数为0自然总和为0)。

转移:f[i][j][kk]=max(f[i-1][j][kk],f[i-1][j-1][(kk+d-a[i]%d)%d]+a[i])(不选取第i个物品或者选取第i个物品,其中(kk+d-a[i]%d)%d]+a[i]是在mod p意义下kk-a[i])。

·代价

O(nkd),立方级别。

·细节

对于除了f[i][0][0]之外的初始值全部赋值为很小的数,最后判断如果答案(f[n][k][0])小于一个界限就是-1,否则就是f[n][k][0]。

·代码

#include
#define D 110
#define K 110
#define N 110
using namespace std;
long long f[N][K][D]={};
int a[N]={},d=0,k=0,n=0;
int main(){
    scanf("%d%d%d",&n,&k,&d);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=0;i<=n;i++){
        for(int j=0;j<=k;j++){
            for(int kk=0;kk

·注意

注意f要开long long((10^9)*100=10^11)。

你可能感兴趣的:(dp)