PAT真题练习(甲级)1068 Find More Coins (30 分)
原题网址:https://pintia.cn/problem-sets/994805342720868352/problems/994805402305150976
思路
用DFS做的
最后一个测试点刚开始超时了,做了特例判断(若所有数加起来小于M,直接跳出)
AC代码
#include <stdio.h>
#include <iostream>
#include <vector>
#include <deque>
#include <algorithm>
#include <numeric>
using namespace std;
vector<int> coins;
int sum = 0;
int N, M;
deque<int> selected;
bool Fill(int spos, int m) {
if (spos >= N || coins[spos] > m ) return false;
if (coins[spos] == m) {
selected.push_back(coins[spos]);
return true;
}
if (Fill(spos + 1, m - coins[spos])) {
selected.push_back(coins[spos]);
return true;
}
else if (Fill(spos + 1, m)) {
return true;
}
}
int main() {
cin >> N >> M;
coins.resize(N);
for (auto i = 0; i < N;i++) {
cin >> coins[i];
}
// 特例,最后一个测试点可能超时
if(accumulate(coins.begin(),coins.end(),0) < M) {
cout << "No Solution";
return 0;
}
sort(coins.begin(), coins.end());
if (Fill(0, M)) {
cout << selected.back();
selected.pop_back();
while (!selected.empty()) {
cout << " " << selected.back();
selected.pop_back();
}
}
else cout << "No Solution";
}