AcWing171.送礼物
创始人
2024-05-30 02:38:23

题目描述

达达帮翰翰给女生送礼物,翰翰一共准备了NNN 个礼物,其中第 iii 个礼物的重量是 G[i]G[i]G[i]。

达达的力气很大,他一次可以搬动重量之和不超过 WWW 的任意多个物品。

达达希望一次搬掉尽量重的一些物品,请你告诉达达在他的力气范围内一次性能搬动的最大重量是多少。

输入格式

第一行两个整数,分别代表 WWW 和 NNN。

以后 N 行,每行一个正整数表示 G[i]G[i]G[i]。

输出格式

仅一个整数,表示达达在他的力气范围内一次性能搬动的最大重量。

数据范围

1≤N≤461 \le N \le 461≤N≤46
1≤W,G[i]≤231−11 \le W,G[i] \le 2 ^ {31} - 11≤W,G[i]≤231−1

输入样例

20 5
7
5
4
18
1

输出样例

19

思路

由于取得方法有2462^{46}246(70368744177664)种,肯定超时。但如果将其分成两组,每组就只有2232^{23}223(8388608)种,这就可以过了。先将第一组可能组成的数存入数组(要去重,不然TLE),然后再枚举第二组,枚举到一个数就二分搜索与第一组可以组成最大的数。

代码

#include 
#include 
using namespace std;int n, w, k;
int a[50];
int pp[16777216], p[16777216], cnt, cnt1, ans;bool cmp(int x, int y)
{return x > y;
}void dfs1(int step, int last) 
{if (step == n / 2) {pp[cnt++] = last;return;}if ((long) last + a[step] <= w) dfs1(step + 1, last + a[step]);dfs1(step + 1, last);
}void dfs2 (int step, int last) 
{if (step == n) {int l = 0, r = cnt - 1;while(l < r) {int mid = (l + r + 1) / 2;if ((long) p[mid] + last <= w) l = mid;else r = mid - 1;}if ((long) p[l] + last <= w) ans = max(ans, p[l] + last);return;}if ((long) last + a[step] <= w) dfs2(step + 1, last + a[step]);dfs2(step + 1, last);
}int main() {cin >> w >> n;for (int i = 0; i < n; i++) cin >> a[i];sort(a, a + n, cmp);k = n / 2;dfs1(0, 0);sort(pp, pp + cnt);int cnt1 = cnt;cnt = 0;for (int i = 1; i <= cnt1; i++){if (pp[i] != pp[i - 1]) p[++cnt] = pp[i];}dfs2(n / 2, 0);cout << ans << endl;return 0;
}

相关内容

热门资讯

中信重工申请矿样试验装置相关专... 4月18日消息,国家知识产权局信息显示,中信重工机械股份有限公司申请一项名为“一种定量微细粒矿样柔性...
刺破“开票经济”的数字泡沫 最新发票数据显示,截至3月25日,今年违规招商引资企业较为集中的废弃资源综合利用、再生物资回收等六类...
兰州:筑牢食品药品安全防线 食品药品安全事关百姓身体健康和生命安全。自全省“三抓三促”行动开展以来,兰州市市场监督管理局聚焦食品...
同济等3家公司共同取得爆管侦测... 4月18日消息,国家知识产权局信息显示,同济大学、宁波水表(集团)股份有限公司、浙江宁水水务科技有限...
【聚焦教育家精神巡回宣讲】聆听...   4月16日,贵州省2026年教育家精神巡回宣讲暨“讲述我的育人故事”贵安大学城专场活动在贵州财经...