放苹果
放苹果
http://www.nowcoder.com/questionTerminal/bfd8234bb5e84be0b493656e390bdebf
思路
- 分组问题,要是找不到dp的状态转移,或者数学递归规律,首选dfs
#include<iostream> #include<set> #include<string> #include<string.h> #include<algorithm> using namespace std; int visited[10]; set<string> se; int m, n; void dfs(int apple, int plate) { if (apple ==0)/*中止条件*/ { string str; for (int k = 0; k < n; k++)/*这个变成字符串方便去重*/ { str += to_string(visited[k]); } sort(str.begin(), str.end()); se.insert(str);/*set去重*/ return ; } if (plate >=n) return ;/*防止有苹果没有放完的情况,苹果没有放完,但没有盘子了*/ for (int i = 0; i <=apple; i++)/*遍历所有盘子的苹果数*/ { visited[plate]=i;/*保存每个盘子放的苹果数*/ dfs(apple - i, plate +1);/*递归*/ visited[plate] = 0;/*回溯*/ } } int main() { while (cin>>m>>n) { if (!(0 < m && m <= 10) || !(1 <= n && n <= 10)) return -1; dfs(m, 0); cout << se.size() << endl; se.clear(); memset(visited, 0, sizeof(visited)); }
}
```