《算法竞赛进阶指南》送礼物

您所在的位置:网站首页 牛年送的礼物 《算法竞赛进阶指南》送礼物

《算法竞赛进阶指南》送礼物

2024-06-09 05:14| 来源: 网络整理| 查看: 265

送礼物

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

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

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

输入格式 第一行两个整数,分别代表W和N。

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

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

数据范围 1≤N≤46, 1≤W,G[i]≤231−1 输入样例: 20 5 7 5 4 18 1 输出样例: 19

首先本题使用dfs算法寻找数据的所有组合,挑选其中合法的最大的值。 如果是简单的暴搜的话,2^46的搜索量的话一定会超时的,我们这里利用一个技巧: 先对前半部分进行搜索将得到存储到数组中; 然后在对后半部分进行搜索,在搜索结束时,在利用二分的方法在前半部分中寻找合法且最大的值。这样O(2^23)+O( 2 ^23)*O(log(n/2))的数据量会明显降低数据搜索量 #include #include using namespace std; const int N=1//当达到我们的目标的搜索深度时,储存我们当前的数据 weights[cnt++]=s; return; } if((LL)s+g[u]//当我们后半部分搜索完毕时,通过二分来与前半部分进行合法的组合 int l=0,r=cnt-1; while(l cin>>m>>n; for(int i=0;i>g[i]; sort(g,g+n); reverse(g,g+n); k=n/2+2; //如果直接暴力搜索的话是2^46的搜索复杂度的,时间肯定会超时 //这里我们用到的思想是先对前一般的数据进行暴搜,将得到的小于m的所有结果存储到weights数组中 //然后在对另一半的数据进行搜索,在搜索结束时,在利用二分的方法查找所有合法的结果,每次与答案比较,得到最有解 dfs(0,0);//对前一般数据进行搜索 //我们对得到的前半部分所有组合的合法的数据进行排序、判重 sort(weights,weights+cnt); int t=1; for(int i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3