算法思路
考虑到本算法的时间复杂度,如果遍历全部的情况会导致TLE,故需要进行一定的剪枝。
所以本题需要进行适当的剪枝,优先搜索状态较少的方案,即从个体质量较大的单位开始搜索。同时对非最优方案进行剪枝,最终可以得到结果
算法实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include <iostream> #include <algorithm>
using namespace std;
const int N = 20; int n, w; int res; int c[N], group[N];
void dfs(int t, int g) { if (g > res) return; if (t == n) { res = g; return; } for (int i = 0; i < g; ++i) { if (c[t] + group[i] <= w) { group[i] += c[t]; dfs(t + 1, g); group[i] -= c[t]; } } group[g] += c[t]; dfs(t + 1, g + 1); group[g] = 0; }
int main() { res = 0x3f3f3f3f; cin >> n >> w; for (int i = 0; i < n; ++i) cin >> c[i]; sort(c, c + n); reverse(c, c + n); dfs(0, 1); cout << res; }
|