暴力流——HDU-2079(选课时间)
Posted mid2dog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暴力流——HDU-2079(选课时间)相关的知识,希望对你有一定的参考价值。
前言
动态规划真的不入脑啊。鸽了那么久,现在把暴力题解放上来
看到这题立马有种动态规划的感觉,小测结束后得知可以用母函数(虽然我也不知道母函数是个啥)
但对中二狗来说,干就完了,奥里给!
现在当事人表示非常后悔,暴力解了近一个小时,反而更麻烦,我还不如学个dp回来做题
暴力超神!附偷过来的一张图
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2079
题解思路
实话说本来还有点担心超时,但转眼就让我下定决心用暴力的,还是因为题目的数据。你瞧瞧!
数据挺小的(雾),时间复杂度也就是O(a^b)
说实话没超时确实是奇迹,这尼玛就离谱,最大可能都到十的八次了
谁知道里面的数据是怎么想的呢= =
然后我就想写k个for循环,对,就是你想的那样,i,j……一层层下来
但这时候出了点麻烦,我不知道k的值,所以我不知道要提前写几个for循环啊!!!!!
然后,我想了想,比起现学动态,还是继续把这问题解决吧,上百度搜
搜到了这个
博文的内容就不放了,懒。掌握个思路就好了,明白了可以用递归,递归里再安排个参数小于k就能实现指定次数的循环
然后,就可以用for循环递归暴力啦。
我在代码里加了很多详细注释,应该很容易懂吧。。
AC代码
#include<iostream>//输入输出流,类似于c语言的stdio.h
using namespace std;
int a[10],b[10],n,s,k;//提前声明变量,因为调用了递归函数
void digui(int t,int sum)//sum代表学分总数
for(int i=0;i<=b[t];i++)//i代表该学分课程的个数
//总共有b[t]个,但我可以取1个1学分,也可以取多个
//所以自然而然开个循环
sum += i*a[t]; //学分个数i乘以学分数,然后和目标n比
if(sum>n) //如果总学分超过了n
sum -= i*a[t];//超过了自然要减去有这个i的这种情况
continue;// 跳到下一个i继续把下一种搞定
if(sum == n)s++;//如果相等了就+1种情况,s代表情况数
else if(t<k)digui(t+1,sum);//没到次数就继续往下一个走
sum -= i*a[t];/*所有有关这种情况的在上面的递归中已经
都搞定了,所以现在把sum里加上这种情况的都减去,然后
开始下一个i的循环 */
int main()
int T;cin>>T;//输入组数
while(T--)
s=0;
cin>>n>>k;//输入n与k
for(int i=1;i<=k;i++)
cin>>a[i]>>b[i]; //输入学科与学分
digui(1,0);//从a[1]开始 sum是0这样就可以层层叠上去
cout<<s<<endl;//输出s与换行
还是那句话,当事人十分后悔,想暴力做也不是那么容易的。
以上是关于暴力流——HDU-2079(选课时间)的主要内容,如果未能解决你的问题,请参考以下文章