計蒜客-買書-dfs剪枝

題目鏈接
果然還是太菜了…解空間樹考慮得太粗了,超時代碼(shame)

#include<bits/stdc++.h>

using namespace std;
int  m, n, k, p[35];
bool vis[35], flag = false;

void dfs(int now){
	if(now >= k){
		if(m == 0)
		{
			printf("Yes\n");
			exit(0);
		}
	}
	for(int i = 0; i < n; i++){
		if(m < p[i])
			break;
		if(!vis[i]){
			vis[i] = true;
			m -= p[i];
			dfs(now + 1);
			m += p[i];
			vis[i] =false;
		}
	}
}

int main()
{
	memset(vis, false, sizeof(vis));
	scanf("%d%d%d", &m, &n, &k);
	int i, j;
	for(i = 0, j = 0; i < n; i++){
		scanf("%d", &p[j]);
		if(p[j] <= m)
			j++;
	}
	n = j;
	sort(p, p + n);
	dfs(0);
	printf("No\n");
	return 0;
}

參考別人的代碼後,AC代碼如下

#include<bits/stdc++.h>

using namespace std;
int m, n, k, p[35];

void dfs(int t, int sum, int num){
	if(sum == m && num == k)
	{
		printf("Yes\n");
		exit(0);
	}
	if(num > k || sum > m || t == n)
		return ;
	for(int i = 1; i <= 2; i++){
		if( i & 1)
			dfs(t + 1, sum + p[t], num+1);
		else
			dfs(t + 1, sum , num);
	}
}

int main()
{
	scanf("%d%d%d", &m, &n, &k);
	for(int i = 0; i < n; i++)
		scanf("%d", &p[i]);
	dfs(0, 0, 0);
	printf("No\n");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章