问题 H: 【递归】油桶问题————递归+思维

  • Post author:
  • Post category:其他

题目描述
楚继光扬扬得意道:“当日华山论剑,先是他用黯然销魂掌破了我的七十二路空明拳,然后我改打降龙十八掌,却不防他伸开食指和中指,竟是六脉神剑,又胜我一筹。可见天下武学彼此克制,武学之道玄之又玄!……哎,谁用炒锅敲我头?”

楚继光的老妈大声骂道:“玩个石头剪刀布都说得这般威风,炒菜没油了,快给我去装!”

“这么凶干嘛?不就吹吹牛嘛。”楚继光边嘟嘟囔囔边走进储藏室,看到储藏室有N个油桶都装满了油,这N个油桶容积各不相同(容积为整数),楚继光需要M升油(M也为整数),请你不借助任何其他容器,判断能否直接在N桶油中取任意K桶(1≤K≤N)油,其油的总量正好是M升,如果可以,就输出yes,否则输出no。
输入
第一行为两个整数N,M,第二行为N个整数,即油桶的容积。
输出
输出结果即yes或者no。
样例输入 Copy
5 10
1 2 3 1 1
样例输出 Copy
no

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1000;
int a[N];
int n,k;
bool st[N];
int f;
void dfs(int sum)
{
	if(sum>k) return ; //边界条件  
	if(sum==k) //正好等于k,说明存在这种情况 
	{
		f=1;
		return ;
	}
	else
	{
		for(int i=1;i<=n;i++)
		{
			if(!st[i]) //用过要标记 
			{
				sum+=a[i];
				st[i]=true;
				dfs(sum); 
				st[i]=false;//恢复现场。 
				sum-=a[i];
			}
		}
	}
}
int main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>a[i];
	dfs(0);
	if(f==0) puts("no");
	else puts("yes");
}

版权声明:本文为qq_43690454原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。