题目描述:
总共有 $N$ 只小猫坐缆车下山。每辆缆车的最大承重为 $ W $ ,小猫的重量分别为 $ C_1, c_2,\cdots, C_N $ 。每辆缆车不能超重。每租用一辆缆车就要花费 $ 1 $ 美元,最小需要付多少美元?
数据范围:
$ 1\le N \le 18,1\le C_i \le W \le 10^8 $
题解:
和 1118-分成互质组 | Luobuyu’s Blog 类似,只需要加个剪枝就能过。
代码:
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 48 49
| using namespace std; using namespace FAST_IO; const ll mod = 1e9 + 7; const int INF = 0x3f3f3f3f; const ll INF_LL = 0x3f3f3f3f3f3f3f3f; const double eps = 1e-5; const int maxn = 1e3 + 10; const int maxm = 1e5 + 10; int t, n, m, k; ll a[maxn]; ll sum[maxn]; int ans = INF; void dfs(int step, int cnt) { if (cnt >= ans) return; if (step == n + 1) { ans = min(ans, cnt); return; } for (int i = 1; i <= cnt; i++) { if (sum[i] + a[step] <= m) { sum[i] += a[step]; dfs(step + 1, cnt); sum[i] -= a[step]; } } sum[++cnt] += a[step]; dfs(step + 1, cnt); sum[cnt--] -= a[step]; } int main() {
#ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif read(n, m); for (int i = 1; i <= n; i++) { read(a[i]); } dfs(1, 0); printf("%d\n", ans); return 0; }
|