(dfs)选数
題目
從 1,2,3,?,30 這 30 個數(shù)中選 8 個數(shù)出來,使得和值為 200。問有多少種選法。
輸出70.
思路
可行性剪枝:
要么選要么不選,如果選的多,退出,和超過200退出,選到最后一個數(shù),進行判斷,滿足條件ans+1.
重復性剪枝:
選出來的數(shù)的位置是遞增的,用一個參數(shù)來記錄上一次選取的數(shù)的位置,此次選擇從這個數(shù)之后開始選取,最后選出來的方案不會重復
代碼
#include <iostream> using namespace std; int n, k, sum, ans; int a[40]; void dfs(int i, int cnt, int s) {if(cnt>k){return ;}if(s>sum){return ;}if (i == n) {if (cnt == k && s == sum) {ans++;}return;}dfs(i + 1, cnt, s);dfs(i + 1, cnt + 1, s + a[i]); } int main() {n = 30;k = 8;sum = 200;for (int i = 0; i < 30; i++) {a[i] = i + 1;}ans = 0;dfs(0, 0, 0);cout << ans << endl;return 0; } #include <iostream> using namespace std; int n, k, sum, ans; int a[40]; bool xuan[40]; void dfs(int s, int cnt,int pos) {if(s>sum||cnt>k){return ;}if (s == sum && cnt == k) {ans++;}for (int i = pos; i < n; i++) {if (!xuan[i]) {xuan[i] = 1;dfs(s + a[i], cnt + 1,i+1);xuan[i] = 0;}} } int main() {n = 30;k = 8;sum = 200;for (int i = 0; i < 30; i++) {a[i] = i + 1;}ans = 0;dfs(0, 0,0);cout << ans << endl;return 0; }總結(jié)
- 上一篇: matlab二元方程组,用matlab解
- 下一篇: ROS配置分布式通信