• 糖果(动规)


    糖果

    总时间限制: 
    1000ms
     
    内存限制: 
    65536kB
    描述
    由于在维护世界和平的事务中做出巨大贡献,Dzx被赠予糖果公司2010年5月23日当天无限量糖果免费优惠券。在这一天,Dzx可以从糖果公司的N件产品中任意选择若干件带回家享用。糖果公司的N件产品每件都包含数量不同的糖果。Dzx希望他选择的产品包含的糖果总数是K的整数倍,这样他才能平均地将糖果分给帮助他维护世界和平的伙伴们。当然,在满足这一条件的基础上,糖果总数越多越好。Dzx最多能带走多少糖果呢?
    注意:Dzx只能将糖果公司的产品整件带走。
    输入
    第一行包含两个整数N(1<=N<=100)和K(1<=K<=100)
    以下N行每行1个整数,表示糖果公司该件产品中包含的糖果数目,不超过1000000
    输出
    符合要求的最多能达到的糖果总数,如果不能达到K的倍数这一要求,输出0
    样例输入
    5 7
    1
    2
    3
    4
    5
    样例输出
    14
    提示
    Dzx的选择是2+3+4+5=14,这样糖果总数是7的倍数,并且是总数最多的选择。
    【思路】:真是完全没思路。。
    状态转移方程不知道填什么。。。
    f[i][?] 知道i是糖果数但是不知道问号的位置是什么........
    then 题解
    ?的地方是%k的余数、、、、、、、
    完全没想到、、、、、
    代码贴
    【代码】
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    using namespace std;
    int a[101],f[101][101];//f[i][j]:前i种糖果%k=j时的糖果总数; 
    int main()
    {
        int n,k;
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<k;j++)//%k的余数 
            {
                f[i][j]=f[i-1][j];//第i个糖果不拿的值 
                int tmp=(k+j-a[i]%k)%k;//k+是为了防止j-a[i]%k是负数 
               //第i个糖果拿,tmp为f[i-1][?]上一个状态的余数;
               //因为余数j是由这一个状态的余数a[i]%k,和上一个状态的余数
               //相加再%k所得。因为这个糖果拿,所以最值为上一个状态的最值
               //再加上这个糖果的数目;所以我们就要求除上一个状态f[i-1][?] 
                if(!tmp||f[i-1][tmp])//当上一个状态余数为0或者有值说明能推出下一个
                f[i][j]=max(f[i][j],f[i-1][tmp]+a[i]);
            }
        }
        printf("%d",f[n][0]);//n个糖果%k为0的最大值 
        return 0;
    }
  • 相关阅读:
    8.电影推荐
    一.Memcached企业服务
    7.学完linux系统运维到底可以做什么?
    svn+jenkins自动部署
    关于gitlab+jenkins自动部署代码的实现
    Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre
    php实现雪花算法(ID递增)
    php使用rdkafka进行消费
    Burp破解安装(1.7和2.0)
    在已有lnmp环境的基础上安装PHP7
  • 原文地址:https://www.cnblogs.com/zzyh/p/6686505.html
Copyright © 2020-2023  润新知