首页 > [BZOJ] 1606: [Usaco2008 Dec]Hay For Sale 购买干草

[BZOJ] 1606: [Usaco2008 Dec]Hay For Sale 购买干草

1606: [Usaco2008 Dec]Hay For Sale 购买干草

Time Limit: 5 Sec  Memory Limit: 64 MB

Submit: 1335  Solved: 989

[Submit][Status][Discuss]

Description

约翰遭受了重大的损失:蟑螂吃掉了他所有的干草,留下一群饥饿的牛.他乘着容量为C(1≤C≤50000)个单位的马车,去顿因家买一些干草.  顿因有H(1≤H≤5000)包干草,每一包都有它的体积Vi(l≤Vi≤C).约翰只能整包购买,
他最多可以运回多少体积的干草呢?

Input

第1行输入C和H,之后H行一行输入一个Vi.

Output

最多的可买干草体积.

Sample Input

7 3 //总体积为7,用3个物品来背包

2

6

5





The wagon holds 7 volumetric units; three bales are offered for sale with

volumes of 2, 6, and 5 units, respectively.



Sample Output

7 //最大可以背出来的体积



HINT

 

Buying the two smaller bales fills the wagon.

 

Source

Silver

 

Analysis

针对性优化的背包类DPqwq

一开始口胡了一个贪心(降序排序后枚举最大值,然后开始遍历arr往addup里塞草包,如果当前值不合法就跳过找下一个值),居然过了!!!

好吧,还是被CZL一波Hack... 果然是数据太水

后来被LLQ一波对拍打出了问题所在:

如果正解有不连续的元素,贪心会被轻松卡掉(比如5 4 3 2,以上策略优先选5+4然后跳过5)

 

Code

 1 #include
 2 #include
 3 #include
 4 #define maxn 100000
 5 using namespace std;
 6 
 7 int arr[maxn],n,T,ans;
 8 
 9 bool cmp(const int a,const int b){
10     return a>b;
11 }
12 
13 int main(){
14     scanf("%d%d",&T,&n);
15     
16     for(int i = 1;i <= n;i++){
17         scanf("%d",&arr[i]);
18     }
19     
20     sort(arr+1,arr+1+n,cmp);
21     
22     for(int i = 1;i <= n;i++){
23         int addup = 0;
24         for(int j = i;j <= n;j++){
25             if(addup+arr[j] <= T){
26                 addup += arr[j];
27             }
28         }
29         ans = max(ans,addup);
30     }
31     
32     printf("%d",ans);
33     
34     return 0;
35 }
神奇的贪心版本
 1 #include
 2 #include
 3 #define maxn 1000000
 4 using namespace std;
 5 
 6 int DP[maxn],n,m,cnt;
 7 
 8 int main(){
 9     
10     scanf("%d%d",&n,&m);
11     
12     for(int i = 1;i <= m;i++){
13         scanf("%d",&cnt);
14         DP[cnt] = 1;
15         for(int j = n;j >= cnt;j--){
16             DP[j] = DP[j]|DP[j-cnt];
17         }
18     }
19     
20     int ans = n;
21     while(!DP[ans]) ans--;
22     
23     printf("%d",ans);
24     
25     return 0;
26 }
针对性优化背包版本

转载于:https://www.cnblogs.com/Chorolop/p/7460523.html

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • 把字符串看作是26进制的数,从后往前翻译,那么就可以把两个串变成对应的26进制的数字,那么只要把两个数加起来除以二就得到中间的串对应的数了,同理再转化回来就行了。但是这样会有一个问题就是串的长度有2e5,26的2e5次方显然不可求,所以需要对每一位进行手动的加和运算。对于两个串,我们假设a串从后往前的每一位对应的数值为a0, a1,...

  • 中国剩余定理说白了就是小学时候的韩信点兵的完全版。给定一系列数,给定条件是一个数MOD这一些列数的结果,问你最后这个数最少为多少。 抽象出来就是N个同余方程,利用扩展GCD就可以求得这一结果,本题给定的数都是互质的,因此处理起来就简单了。 代码如下: #include #include #inc...