sdut2408 pick apples (贪心+背包)山东省第三届ACM省赛
2014-04-28 15:04
519 查看
本文出自:http://blog.csdn.net/svitter/
题意:三种苹果,每种都有对应的Size,Value,给你一个背包空间,求最大的价值。
本题目的关键就在于非常大的背包空间
依据indicates the size (1 <= S<=
100) 我们可以考虑在1000000(100^3)之外的空间放性价比最高的苹果。为什么时100^3?
要知道背包如果正好填满,而填满空间相应价值的苹果大于不填满的价值的苹果,那么就选择能填满空间而使价值最大的苹果,而非性价比最高的苹果——性价比高的苹果可能因为剩下的空间不足,而造成空间利用不充分达不到最大价值。100^3大于任何3个苹果的Size的最大公倍数,所以选择100^3这个数字。
另:之前把f[1000001]初值赋值为-1, 以此来求背包- =太水了= =完全没有考虑到最后一个f[BagSize]可能为-1的情况,然后写了一个找不是-1的最大Bag值,又水了- =当赋值-1的时候,未必最大的就是空间用的最多的。
简单举例:
BagSize 60, a[1] 59/30, a[2].size 58/31 a[3].size 57/32;
贴代码:
题意:三种苹果,每种都有对应的Size,Value,给你一个背包空间,求最大的价值。
本题目的关键就在于非常大的背包空间
依据indicates the size (1 <= S<=
100) 我们可以考虑在1000000(100^3)之外的空间放性价比最高的苹果。为什么时100^3?
要知道背包如果正好填满,而填满空间相应价值的苹果大于不填满的价值的苹果,那么就选择能填满空间而使价值最大的苹果,而非性价比最高的苹果——性价比高的苹果可能因为剩下的空间不足,而造成空间利用不充分达不到最大价值。100^3大于任何3个苹果的Size的最大公倍数,所以选择100^3这个数字。
另:之前把f[1000001]初值赋值为-1, 以此来求背包- =太水了= =完全没有考虑到最后一个f[BagSize]可能为-1的情况,然后写了一个找不是-1的最大Bag值,又水了- =当赋值-1的时候,未必最大的就是空间用的最多的。
简单举例:
BagSize 60, a[1] 59/30, a[2].size 58/31 a[3].size 57/32;
贴代码:
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; #define lln long long int struct Apple { int Value; int Size; double Cost; }; Apple a[3]; lln f[1001000]; void ace() { int t, i, j, no, most; int BagSize, tempBag; double cost; lln RestNum, ans, RestValue; int Size; scanf("%d", &t); for(no = 1; no <= t; no++) { memset(f, 0, sizeof(f)); f[0] = 0; most = 0; cost = 0; for(i = 0; i < 3; i++) { scanf("%d %d", &a[i].Size, &a[i].Value); a[i].Cost = ((double) a[i].Value) / a[i].Size; if(a[i].Cost > cost)//find the most { most = i; cost = a[i].Cost; } } scanf("%d", &BagSize); RestNum = 0; RestValue = 0; //大于1000的时候,把性价比最高的苹果填入 if(BagSize > 1000000) { tempBag = BagSize - 1000000; RestNum = tempBag / a[most].Size; BagSize -= RestNum * a[most].Size; RestValue = RestNum * a[most].Value; } //剩余的苹果使用背包 for(i = 0; i < 3; i++) { Size = BagSize - a[i].Size; for(j = 0; j <= Size; j++) { f[j + a[i].Size] = max(f[j + a[i].Size], f[j] + a[i].Value); } } ans = RestValue + f[BagSize]; printf("Case %d: %lld\n", no, ans); } } int main() { ace(); return 0; }
相关文章推荐
- Android推送解决方案分析-一共介绍6个
- MVC中DbContext 和ObjectContext两者的区别!
- Android 实例解说Application类
- 基于cocos2d开发的android小游戏——采花仙
- Android之Application
- Android Parcelable的使用
- iOS的应用程序的生命周期
- Android 解决ScrollView嵌入ListView | GridView | ScrollView显示问题
- GridView各种属性小结
- cocos2dx-3.0 X-code项目创建
- Android电池电量更新 - BatteryService(转)
- Android电池电量更新 - BatteryService(转)
- Android电池电量更新 - BatteryService(转)
- Android电池电量更新 - BatteryService(转)
- System Center 2012 R2 自助门户2—App Controller
- Android判断屏幕锁屏的方法总结
- [Unity3D]NGUI用Sprite动画和屏幕自适应做游戏开始场景
- cocos2dx3.0 vector删除元素
- Android中的长度单位分析 以及 Andriod布局的自适应的一些建议 和hdpi的划分以及屏幕分辨率等
- 【Android】ViewGroup全面分析