选择课题(bestproject)

【问题描述】

Robin 要在下个月交给老师 n 篇论文,论文的内容可以从 m 个课题中选择。由于课题数有限,Robin 不得不重复选择一些课题。完成不同课题的论文所花的时间不同。具体地说,对于某个课题 i,若 Robin 计划一共写 x 篇论文,则完成该课题的论文总共需要花费 Ai*x^Bi 个单位时间(系数 Ai 和指数 Bi 均为正整数)。给定与每一个课题相对应的 Ai 和 Bi 的值,请帮助 Robin 计算出如何选择论文的课题使得他可以花费最少的时间完成这 n 篇论文。

【输入格式】

第一行有两个用空格隔开的正整数 n 和 m,分别代表需要完成的论文数和可供选择的课题数。

以下 m 行每行有两个用空格隔开的正整数。其中,第 i 行的两个数分别代表与第 i 个课题相对应的时间系数 Ai 和指数 Bi。

【输出格式】

输出完成 n 篇论文所需要耗费的最少时间。

【输入样例】

10 3

2 1

1 2

2 1

【输出样例】

19

【样例说明】

4 篇论文选择课题一,5 篇论文选择课题三,剩下一篇论文选择课题二,总耗时为 2*4^1+1*1^2+2*5^1=8+1+10=19。可以证明,不存在更优的方案使耗时小于 19。

【数据规模】

对于 40%的数据,n<=10,m<=5;

对于 100%的数据,n<=200,m<=20,Ai<=100,Bi<=5。

【解题思路】

本题属于动态规划中的完全背包问题。·根据动态规划的思想推导状态转移方程,令dp[m][n]表示前m个课题写n篇论文的最优解,以课题为阶段,即为完全背包中以物品为阶段。

然后进行推导,在dp[m][n]之前做了什么,无非就是选择第m个课题写k(0<=k<=n)篇论文。

那么根据这样的推导,状态转移方程就是:dp[m][n]=min(dp[m][n],dp[m-1][n-k]+a[m]*k^b[m]。

数据量不大,完全可以直接dp,无须优化。

【解题反思】

  • 对于经典的模板题应该要十分熟悉
  • 由于结果可能很大,建议使用long long
  • 注意数组的范围

【参考程序】

#include<iostream>
#include<cstdio>
using namespace std;
const long long maxint=1000000000000000;
int n,m,a[21],b[21];
long long f[21][201],ans;
long long power(int x,int y)//求x的y次幂
{
long long sum=1;
for (int i=1;i<=y;i++) sum*=x;
return sum;
}
int main()
{
freopen("bestproject.in","r",stdin);
freopen("bestproject.out","w",stdout);
cin>>n>>m;
for (int i=1;i<=m;i++) cin>>a[i]>>b[i];
for (int i=0;i<=m;i++)
for (int j=1;j<=n;j++) f[i][j]=maxint;
//初始化为无穷大
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
for (int k=0;k<=j;k++)
f[i][j]=min(f[i][j],f[i-1][j-k]+a[i]*power(k,b[i]));//状态转移方程
cout<<f[m][n];
return 0;
}

【集训Day1 测试】选择课题的更多相关文章

  1. 中山纪中集训Day1测试(摸鱼)

    AT3 粉刷匠 Description 赫克托是一个魁梧的粉刷匠,而且非常喜欢思考= = 现在,神庙里有N根排列成一直线的石柱,从1到N标号,长老要求用油漆将这些石柱重新粉刷一遍.赫克托有K桶颜色各不 ...

  2. 【集训Day1 测试】装饰

    装饰(decorate) [题目描述] 一个图有 N 个结点,编号 1 至 N,有 M 条无向边,第 i 条边连接的两个结点是 Ai 和Bi,其中 Ai 和 Bi 是不同的结点.可能有多条边连接的是同 ...

  3. 【集训Day1 测试】【USACO】照相

    照相(fairphoto) [题目描述] 有N 头奶牛站在一条数轴上,第 i 头奶牛的位置是 Pi,奶牛不会重叠站在同一个位置, 第i 头奶牛的颜色是 Ci,其中 Ci 要么是字符'G'要么是字符'H ...

  4. 【集训Day1 测试】奇怪数

    奇怪数(odometer) [题目描述] 一个正整数Z是奇怪数,当且仅当满足的条件是:Z的所有数字中,只有一个数字不同于其他数字.例如:33323.110 都是奇怪数,而 9779.5555 都不是奇 ...

  5. 【欧拉回路+最小生成树】SD开车@山东2018省队一轮集训day1

    目录 [欧拉回路+最小生成树]SD开车@山东2018省队一轮集训day1 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 SOLUTION CODE [欧拉回路+最小生成树]SD开车@ ...

  6. 国庆集训 Day1 T2 生成图 DP

    国庆集训 Day1 T2 生成图 现在要生成一张\(n\)个点的有向图.要求满足: 1.若有 a->b的边,则有 b->a 的边 2.若有 a->b 的边和 b->c 的边,则 ...

  7. 2019暑期金华集训 Day1 组合计数

    自闭集训 Day1 组合计数 T1 \(n\le 10\):直接暴力枚举. \(n\le 32\):meet in the middle,如果左边选了\(x\),右边选了\(y\)(且\(x+y\le ...

  8. 2019暑期金华集训 Day1 数据结构

    自闭集训 Day1 数据结构 CF643G 用类似于下面的方法,搬到线段树上. 如何合并两个集合?先全部放在一起,每次删掉最小的\(cnt_i\),然后把其他所有的\(cnt\)都减去\(cnt_i\ ...

  9. LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set(线性基,贪心)

    LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set $ solution: $ 这一题的重点在于优先级问题,我们应该先保证总和最大,然后再保证某一个最小.于是我 ...

随机推荐

  1. AJAX异步检查,检查用户名是否存在

    AJAX异步检查,检查用户名是否存在 写法一: var xmlHttp; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, ...

  2. 设计模式(十二)Decorator模式

    Decorator模式就是不断地为对象添加装饰的设计模式.以蛋糕为例,程序中的对象就相当于蛋糕,然后像不断地装饰蛋糕一样地不断地对其增加功能,它就变成了使用目的更加明确的对象. 首先看示例程序的类图. ...

  3. IndentationError: unindent does not match any outer indentation level笔记

    执行一个Python脚本的时候,报"IndentationError: unindent does not match any outer indentation level" 错 ...

  4. CSPS模拟 77

    %%两位AK爷zkt和skyh T1 位间独立,分别讨论 T2 维护标记,代替移位 T3 同一点对,多种联通,没法搞. 发现最多四路连通,考虑容斥. 显然的奇加偶减. 发现统计某种颜色的点之间的联通数 ...

  5. CSPS模拟 67

    炸分炸的厉害.(当然这跟b哥定律无关 话说好久没人嘲笑我菜了,快飘的不知道到哪了. 谁能讽我两句我不要面子的. 另外在博客上写些没用的东西好浪费精力啊我又不想当网红 主要是考试的时候心态不稳. 以为T ...

  6. JS- 封装、继承、多态

    http://www.cnblogs.com/silence516/articles/1509456.html

  7. Oracle“ORA-00979:不是GROUP BY 表达式”解决方式

    今天在工作中碰到一个问题,用group by 语句进行分组时出现ORA-00979错误. 代码如下: select R.ORDER_NO, R.PRODUCT_CODE, R.REGION_NO, R ...

  8. 基于 H5 Canvas 实现楼宇自控系统

    前言 楼宇自控是指楼宇中电力设备,如电梯.水泵.风机.空调等,其主要工作性质是强电驱动.通常这些设备是开放性的工作状态,也就是说没有形成一个闭环回路.只要接通电源,设备就在工作,至于工作状态.进程.能 ...

  9. python——函数的基本概念

    Python函数认识 数学定义 y = f(x), y是x的函数,x是自变量. python中的函数组成 由若干语句组成的语句块.函数名称.参数列表构成,函数是组织代码的最小单元 像一个黑盒子,我们给 ...

  10. 一种logging封装方法,不会产生重复log

    在调试logging的封装的时候,发现已经调用了logging封装的函数,在被其它函数再调用时,会出现重复的logging.原因是不同的地方创建了不同的handler,所以会重复,可以使用暴力方法解决 ...