HDOJ 1557(列舉或搜尋)

2021-06-22 11:17:41 字數 969 閱讀 6458

題目中每個團體加入或不加入聯盟一共有2^20種可能性,資料規模很小,直接列舉即可:

#include int main()

threshold = threshold / 2 + 1;

for(k = 1, limit = 1 << n; k < limit; ++k)

if(sum < threshold) continue;

for(i = 0; (mask = 1 << i) <= k; ++i)

}printf("%d", cnt[0]);

for(i = 1; i < n; ++i) printf(" %d", cnt[i]);

puts("");

}return 0;

}

用dfs代替手動列舉還可以寫成:

#include int n, arr[20], cnt[20], threshold;

int stack[20], size;

void dfs(int i, int sum)

}return;

}dfs(i - 1, sum);

stack[size++] = i;

dfs(i - 1, sum + arr[i]);

--size;

}int main()

threshold = threshold / 2 + 1;

size = 0;

dfs(n-1, 0);

printf("%d", cnt[0]);

for(i = 1; i < n; ++i) printf(" %d", cnt[i]);

puts("");

}return 0;

}

上面不加剪枝的dfs和列舉實際上都是遍歷所有的可能性,但從結果上來看,dfs還是快一些,畢竟列舉的時候每次都還要掃瞄2遍全部團體是否加入,而dfs時已經將這一資訊記錄下來

7 2列舉排列

7.2.1生成1 n 的排列 問題描述 輸入整數n,按照字典序從小到大列印出1 n的去所有排列。兩個序列的字典序大小關係等價於從頭開始第乙個不相同處的大小關係,例如 1,2,3 3,2,1 n 3時,輸出結果是 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 演算法思想 設集...

9 4 列舉型別

乙個變數只有幾種可能的取值,可以一一枚舉出來,變數的取值僅限於列舉的值的有限範圍內,而不適宜用整型 實型 字元型直接表示,c語言提供了這種列舉資料型別。例如,一年的四季有春夏秋冬 乙個星期有星期日 星期一到星期六等。定義列舉型別的一般形式為 enum 列舉型別名 如 enum weekday 1.列...

146 列舉型別

除了簡單的變數型別之外,c 還提供了3個複雜的變數 列舉,結構和陣列。列舉型別的定義 enum 列舉型別的宣告 列舉型別的賦值 在遊戲中我們可以定義乙個int型別來儲存狀態 0 遊戲暫停 1遊戲失敗 2遊戲勝利 3開始選單,但是這樣不容易閱讀,而且容易出錯。這個時候我們通過列舉型別來解決 enum ...