L3-001 凑零钱 (30 分)

题目链接

DFS+剪枝

这种选和不选的题最好用递归做了,但是需要剪枝,然后就是对特殊情况的考虑,不然会超时。

注意

当数组中所有数的和加起来都达不到目标值,就没必要搜索了,直接输出无解

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4+5;
const int maxx = 1e6+5;
int arr[maxn];
int dp[maxx];
int n, m, flag = 0;
vector<int> ans;
void dfs(int i, int sum, vector<int> v){
	if(sum > m || flag == 1||i == n) return;
	int cur = sum + arr[i];
	if(cur == m){
		v.push_back(arr[i]);
		ans = v;
		flag = 1;
		return;
	}
	if(cur < m) {
		v.push_back(arr[i]);
		dfs(i+1, cur, v);
	}
	if(!v.empty()) v.pop_back();
	dfs(i+1, sum, v);
}
int main(){
	
	cin >> n >> m;
	int sumx = 0;
	for(int i = 0; i < n; i++){
		cin >> arr[i];
		sumx += arr[i];
	} 
	if(sumx < m){
		cout<<"No Solution";
		return 0;
	}
	sort(arr, arr + n);
	vector<int> v;
	dfs(0, 0, v);
	if(ans.size()==0){
		cout<<"No Solution";
		return 0;
	}
	for(int i=0;i<ans.size();i++){
		cout<<ans[i];
		if(i!=ans.size()-1) cout<<" ";
		else cout<<endl;
} 
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值