传送门

f[i][j]表示前i首歌放到前j个盘里最多能放多首

ntr[i][j]表示i~j中最多能放进一张盘中多少首歌

ntr数组可以贪心预处理出来。

#include <cstdio>
#include <iostream>
#include <algorithm>
#define N 21
#define max(x, y) ((x) > (y) ? (x) : (y)) int n, t, m;
int a[N], b[N], ntr[N][N], f[N][N];
//f[i][j]表示前i首歌放到前j个盘里最多能放多首
//ntr[i][j]表示i~j中最多能放进一张盘中多少首歌 inline int read()
{
int x = 0, f = 1;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
return x * f;
} inline void init()
{
int i, j, k, sum, cnt;
for(i = 1; i <= n; i++)
for(j = i; j <= n; j++)
{
sum = cnt = 0;
for(k = i; k <= j; k++) b[k] = a[k];
std::sort(b + i, b + j + 1);
for(k = i; k <= j; k++)
if(sum + b[k] <= t)
{
cnt++;
sum += b[k];
}
ntr[i][j] = cnt;
}
} int main()
{
int i, j, k;
n = read();
t = read();
m = read();
for(i = 1; i <= n; i++) a[i] = read();
init();
for(i = 1; i <= n; i++)
for(j = 1; j <= m; j++)
for(k = 0; k < i; k++)
f[i][j] = max(f[i][j], f[k][j - 1] + ntr[k + 1][i]);
printf("%d\n", f[n][m]);
return 0;
}

  

最新文章

  1. SQL Server附加数据库时报1813错误的解决方案
  2. CE取系统时间值
  3. Eclipse 关联项目的源码
  4. jQuery实现全选、全不选、反选
  5. TreeMap按照value进行排序
  6. USACO 5.4 Twofive(DP)
  7. 华清远见金牌讲师名家大讲堂Android开发篇成功举办
  8. BooleanToVisibilityConverter.cs
  9. OpenGL 开始学习指南
  10. .NET判断某一年的所有放假的日期
  11. 1020. Tree Traversals (序列建树)
  12. UVA10562 数据结构题目
  13. Cortex-M3学习日志(三)-- 外部中断0
  14. [转]C/C++:构建你自己的插件框架
  15. npm install fetchmatedata慢的解决办法
  16. 201521123020《Java程序设计》第2周学习总结
  17. Lua的函数调用和协程中,栈的变化情况
  18. 《Office 365开发入门指南》上市说明和读者服务
  19. 在Android中调用USB摄像头
  20. Linux学习笔记之五————Linux常用命令之用户、权限管理

热门文章

  1. java中的compareto方法以及LIst列表排序的详细介绍【转】
  2. [转]VC++的类头文件
  3. Java GUI 基础组件
  4. Java GUI 布局管理器
  5. 正确使用MySQL JDBC setFetchSize()方法解决JDBC处理大结果集 java.lang.OutOfMemoryError: Java heap space
  6. elasticsearch插入索引文档 对数字字符串的处理
  7. Tomcat和搜索引擎网络爬虫的攻防
  8. EXCEL Skills Commonly Used
  9. Android(java)学习笔记170:服务(service)之服务的生命周期 与 两种启动服务的区别
  10. vs2008控件查看器