蓝桥杯 金额查错 题型:排列组合 去重 独立完成

97 阅读1分钟

0金额查错 - 蓝桥云课 (lanqiao.cn)

根据题意很明显,让我们从数组中找出所有可以满足target的组合

#include<bits/stdc++.h>
#include<vector>
using namespace std;
int n,sum;
int a[110];
int sub;


vector<int>v;
vector<vector<int>>vv;
void dfs(int index,int sum)
{
	if(sum==sub)
	{
		vv.push_back(v);
		return;
	}
	
	for(int i=index;i<n;i++)
	{	
	   v.push_back(a[i]);
		sum+=a[i];
	    dfs(i+1,sum);
        v.pop_back();
		sum-=a[i];
	}
}
int main()
{
	int wa;cin>>wa;
	
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		sum+=a[i];
	}
	
    sub=sum-wa;
	
	dfs(0,0);
	
	
	for(int i=0;i<vv.size();i++)
	{
		for(int j=0;j<vv[i].size();j++)
		{
			cout<<vv[i][j]<<" ";
		}cout<<endl;
	}


	
	
	return 0;
} 

经过dfs之后发现有重复的组合,像[3,4]和[4,3]其实是一种组合 image.png

我们先排个序,再用set去个重: image.png

#include<bits/stdc++.h>
#include<vector>
using namespace std;
int n,sum;
int a[110];
int sub;



vector<int>v;
set<vector<int>>s;
void dfs(int index,int sum)
{
	if(sum==sub)
	{
		s.insert(v);
		return;
	}
	
	for(int i=index;i<n;i++)
	{	
	   v.push_back(a[i]);
		sum+=a[i];
	    dfs(i+1,sum);
        v.pop_back();
		sum-=a[i];
	}
}
int main()
{
	int wa;cin>>wa;
	
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		sum+=a[i];
	}
	
    sub=sum-wa;
	
	sort(a,a+n);
	dfs(0,0);
	


for(auto it:s)
{
	for(int num:it)
	{
		cout<<num<<" ";
	} cout<<endl;
}
	
	
	return 0;
} 

image.png