(信息学奥赛一本通 1299)糖果
来源:互联网 发布:人肉软件是什么 编辑:程序博客网 时间:2024/05/18 00:47
题意:给出n个数,找出若干个数,使它们的和为k的倍数,并输出最大的数。
状态转移方程:f[i][j]表示前i个数%k=j的总数。
f[i][j]=max(f[i-1][j],f[i-1][tmp]+a[i]);
tmp=(k+j-a[i]%k)%k(避免负数)
第一种情况不选第i个数,第二种情况为选这个数时的最优值
(当然要满足tmp=0或者f[i-1][tmp]有最优值)
#include<cstdio>
#include<algorithm>
using namespace std;
int a[101],n,k,f[101][101];
int main(){
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++){
f[i][j]=f[i-1][j];//不选的情况
int tmp=(k+j-a[i]%k)%k;//避免负数
if (!tmp||f[i-1][tmp]) f[i][j]=max(f[i][j],f[i-1][tmp]+a[i]);//推导
}
printf("%d",f[n][0]); //选n个数并且余数为0的最优值。
return 0;
}
阅读全文
0 0
- (信息学奥赛一本通 1299)糖果
- (信息学奥赛一本通 1301)大盗阿福
- 最长公共子序列(信息学奥赛一本通1297)
- (信息学奥赛一本通 1298)计算字符串距离
- 《信息学奥赛一本通》例9.13 庆功会
- C++信息学奥赛一本通1000
- C++信息学奥赛一本通1049
- C++信息学奥赛一本通1026
- C++信息学奥赛一本通1027
- C++信息学奥赛一本通1028
- C++信息学奥赛一本通1029
- C++信息学奥赛一本通题库1030
- C++信息学奥赛一本通题库1031
- C++信息学奥赛一本通题库1032
- 信息学奥赛一本通(C++版) 第一部分 C++语言 第一章 C++语言入门
- 信息学奥赛一本通(C++版) 第一部分 C++语言 第二章 顺序结构程序设计
- 信息学奥赛一本通(C++版) 第一部分 C++语言 第五章 数 组
- 信息学奥赛一本通(C++版) 第一部分 C++语言 第六章 函数
- 记录一次升级迁移的过程
- 转义字符介绍
- R中处理空间面板模型的包spdep的用法
- JpaRepository查询方法名规范
- STL概述
- (信息学奥赛一本通 1299)糖果
- New Document
- GET和POST的区别
- 496. Next Greater Element I
- 内联函数inline
- dsetup.dll(附dsetup.dll文件丢失修复方法)
- C4GPLT_L1-001_HelloWorld
- java中主窗体关闭子窗体不关闭的解决办法
- SQL SELECT INTO