【noi 2.6_2989】糖果(DP)

题意:求取到总和为K的倍数的糖果的最大值。

解法:用模K的余数作为一个维度,f[i][j]表示在前i种糖果中取到总颗数模K余j的最大总颗数。

注意——f[i-1][j]要正常转移,而其他要之前的状态存在才能状态转移。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 using namespace std;
 6
 7 int a[110],f[110][110];
 8 int mmax(int x,int y) {return x>y?x:y;}
 9
10 int main()
11 {
12     int n,k;
13     scanf("%d%d",&n,&k);
14     for (int i=1;i<=n;i++) scanf("%d",&a[i]);
15     memset(f,0,sizeof(f));
16     for (int i=1;i<=n;i++)
17      for (int j=0;j<k;j++)
18      {
19        f[i][j]=f[i-1][j];//
20        int x=(j-(a[i]%k)+k)%k;
21        if (f[i-1][x]||!x) f[i][j]=mmax(f[i][j],f[i-1][x]+a[i]);
22      }
23     printf("%d\n",f[n][0]);
24     return 0;
25 }
时间: 2024-08-04 09:50:02

【noi 2.6_2989】糖果(DP)的相关文章

BZOJ 2436 Noi嘉年华(优化DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2436 题意:有一些活动,起始时间持续时间已知.有两个场地.每个活动最多只能在一个场地举行,且两个场地同一时间不能都举行活动.但是同一场地同一时间可以举行多个活动.要求的是两个场地中活动数目少的场地的活动数目的最大值S.再输出某个活动必须被安排时的S值. 思路:我直接粘贴原思路了. 区间离散化,设A={嘉年华1的活动}, B={嘉年华2的活动},C={未安排的活动}. 设num[i][j

【BZOJ 2436】 2436: [Noi2011]Noi嘉年华 (区间DP)

2436: [Noi2011]Noi嘉年华 Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不同的地点举办.每个嘉年华可能包含很多个活动,而每个活动只能在一个嘉年华中举办. 现在嘉年华活动的组织者小安一共收到了 n个活动的举办申请,其中第 i 个活动的起始时间为 Si,活动的持续时间为Ti.这些活动都可以安排到任意一个嘉年华的会场,也可以不安排. 小安通过广泛的调查发现,如果某个时刻,两个嘉

openjudge2989糖果[DP 01背包可行性]

openjudge2989糖果 总时间限制:  1000ms 内存限制:  65536kB 描述 由于在维护世界和平的事务中做出巨大贡献,Dzx被赠予糖果公司2010年5月23日当天无限量糖果免费优惠券.在这一天,Dzx可以从糖果公司的N件产品中任意选择若干件带回家享用.糖果公司的N件产品每件都包含数量不同的糖果.Dzx希望他选择的产品包含的糖果总数是K的整数倍,这样他才能平均地将糖果分给帮助他维护世界和平的伙伴们.当然,在满足这一条件的基础上,糖果总数越多越好.Dzx最多能带走多少糖果呢?注意

ACdream HUT新生摸底训练赛 C 娜娜梦游仙境系列——吃不完的糖果 DP

解题思路:环形数组最大字串,穿过和不穿过的DP 解题代码: 1 // File Name: c.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月12日 星期日 19时52分24秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<st

noi 162 post office dp

大致题意: 有v个村庄,每个村庄有各自的位置,且每个位置互不相同.现在要在村庄上设立P个邮局,使每个村庄到最近的邮局的距离之和最小. 分析: 定义状态d[i][j]表示前i个村庄,在这i个村庄中设立j个邮局的最小距离.s[i][j]表示村庄i至村庄j这几个村庄中设立一个邮局的最小距离.如果设立一个邮局,那么邮局设立在(a+b)/2这个位置是最优的.所以可以分解成以下子问题: d[i][j]的最小值为d[k][j-1]的最小值加上s[k+1][i],s[k+1][i]为在k+1至i这几个村庄中设立

poj 1185 炮兵阵地(状态压缩dp)

Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图.在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队):一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格.图上其它白色网格均攻击不

ACM 学习心得

ACM 学习心得 STL:完美的艺术品 STL 由四大部分组成:算法.容器.迭代器.仿函数. 算法(algorithm) 算法定义了一组与实现无关的操作,也是 ACM 学习的核心.C++ 算法库的内容全都是一些比较基本的算法,包括移动.转换.遍历.删除.过滤等等.C++ 算法库本身是基于抽象的,在迭代器的抽象下,使得这些算法可以在不同结构的容器中重用.一个比较坑的地方就是我高中的时候学完 C++ 之后报名了 NOIP.那一年刚刚允许用 STL(之前一直不准用),然后我对于标准库的依赖很严重,连快

20190809 B组总结

DP专题比赛…… T1: 赛中: 一道简单的DP题,直接根据题意设了一个四维数组然后推了推就做完了. 赛后: 这是正解(但是为什么这个要设为5000ms的限时???) 设个500ms都不为过…… 题目正解: DP T2: 赛中: 这个题好难,放弃治疗…… 什么,好像可以DFS 于是快乐的DFS过掉样例…… 赛后: 居然愉快的拿了37.5分 不错不错…… 可是大佬说这道题可以用矩阵乘法,但是得先推出DP转移式 题目正解: DP+矩阵乘法 T3: 赛中: 这不是一道水题吗? 可是瞬间尴尬,我又不会了

noi 2989 糖果

题目链接:http://noi.openjudge.cn/ch0206/2989/ 首先,数据很大,直接用背包会re. 这里增加的是对%k 的余数维度.f[i][j] 表示前 i 种糖果取到总颗数模 k 余数为 j 的最大颗数. 注意一定要先将 f[i-1][j] 转移到 f[i][j] ,再枚举余数dp,不然会有重叠.答案是 f[n][0]; #include <bits/stdc++.h> using namespace std; int a[1050]; int d[1001000];