2 条题解
-
0
按题意直接模拟即可。
AC code:
#include <bits/stdc++.h> using namespace std; int main() { vector<int> primes; bool is_prime[301] = {false}; for (int i = 2; i <= 300; ++i) { if (!is_prime[i]) { if (i != 2) { primes.push_back(i); } for (int j = i * i; j <= 300; j += i) { is_prime[j] = true; } } } int n, m; cin >> n >> m; vector<vector<int> > result; vector<int> path; function<void(int, int, int)> backtrack = [&](int k, int sum, int start) { if (k == n) { if (sum == m) { result.push_back(path); } return; } if (start + (n - k) > primes.size()) { return; } int remain = n - k; int min_remain = 0; for (int i = 0; i < remain; ++i) { if (start + i >= primes.size()) { min_remain = INT_MAX; break; } min_remain += primes[start + i]; } if (sum + min_remain > m) { return; } if (sum > m) { return; } for (int i = start; i < primes.size(); ++i) { int current = primes[i]; if (path.empty() || current > path.back()) { path.push_back(current); backtrack(k + 1, sum + current, i + 1); path.pop_back(); } } }; backtrack(0, 0, 0); if (result.empty()) { cout << "No Answer." << endl; } else { cout << result.size() << endl; for (const auto& combo : result) { for (size_t i = 0; i < combo.size(); ++i) { if (i > 0) { cout << " "; } cout << combo[i]; } cout << endl; } } return 0; } -
0
直接爆搜即可。
#include <bits/stdc++.h> using namespace std; const int p[64]={3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293}; int o[22],n,m; void output() { for(int i=n;i>=1;i--) cout<<o[i]<<' '; cout<<endl; } int dfs1(int h,int l,int s) { if(s<0) return 0; if(l==0) { if(s==0) return 1; return 0; } int ans=0; for(int i=h+1;i<=60;i++) ans+=dfs1(i,l-1,s-p[i]); return ans; } void dfs2(int h,int l,int s) { if(s<0) return; if(l==0) { if(s==0) output(); return; } for(int i=h+1;i<=60;i++) { o[l]=p[i]; dfs2(i,l-1,s-p[i]); } } int main() { cin>>n>>m; int f=dfs1(-1,n,m); if(!f) { puts("No Answer."); return 0; } cout<<f<<endl; dfs2(-1,n,m); return 0; }
- 1
信息
- ID
- 26
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 8
- 已通过
- 3
- 上传者