题目:POJ 3187
思路:
这道题很简单,用next_permutation枚举1~N的所有排列,然后依次相加,判断最后的和是否等于sum,是的话则break,即为字典序最前的。
1 #include <iostream> 2 #include <algorithm> 3 4 using namespace std; 5 6 int n; 7 int sum; 8 int mycase[11][11]; 9 10 int main() { 11 cin >> n >> sum; 12 for (int i = 1; i <= n; i++) { 13 mycase[n][i] = i; 14 } 15 do { 16 for (int i = n; i > 1; i--) { 17 for (int j = 1; j < i; j++) { 18 mycase[i - 1][j] = mycase[i][j] + mycase[i][j + 1]; 19 } 20 } 21 if (mycase[1][1] == sum) { 22 for (int i = 1; i <= n; i++) { 23 cout << mycase[n][i] << " "; 24 } 25 break; 26 } 27 } while (next_permutation(mycase[n] + 1, mycase[n] + 1 + n)); 28 return 0; 29 }
注意:
- next_permutaiton()的两个参数分别是枚举起始的元素,和结束的元素的后一个元素。
时间: 2024-10-21 05:11:02