暴力流——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(选课时间)的主要内容,如果未能解决你的问题,请参考以下文章

杭电ACM hdu 2079 选课时间 (模板)

HDU2079 选课时间母函数

HDU2079 选课时间母函数

HDU 2079 选课时间(母函数)

hdu2079 选课时间(题目已修改,注意读题) 母函数

HDU 2079 dp解法