暴力流——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与换行 
	}
}

还是那句话,当事人十分后悔,想暴力做也不是那么容易的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值