宝物筛选(Treasure.pas/c/cpp)
2011-09-25 19:09
821 查看
宝物筛选(Treasure.pas/c/cpp)
【题目描述】
终于,破解了千年的难题。小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎。但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物。看来小FF只能含泪舍弃其中的一部分宝物了……小FF对洞穴里的宝物进行了整理,他发现每样宝物都有一件或者多件。他粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:小FF有一个最大载重为W的采集车,洞穴里总共有n种宝物,每种宝物的价值为v[i],重量为w[i],每种宝物有m[i]件。小FF希望在采集车不超载的前提下,选择一些宝物装进采集车,使得它们的价值和最大。
【输入格式】
第一行为一个整数N和w,分别表示宝物种数和采集车的最大载重。
接下来n行每行三个整数,其中第i行第一个数表示第i类品价值,第二个整数表示一件该类物品的重量,第三个整数为该类物品数量。
【输出格式】
输出仅一个整数ans,表示在采集车不超载的情况下收集的宝物的最大价值。
【输入样例】
4 20
3 9 3
5 9 1
9 4 2
8 1 3
【输出样例】
47
【数据范圈】
对于30%的数据:n≤∑m[i]≤10^4;0≤W≤10^3。
对于100%的数据:n≤∑m[i]≤10^5;
0 <w≤4*10^4:1≤n<100。
========================================
多重背包...
===========================
【题目描述】
终于,破解了千年的难题。小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎。但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物。看来小FF只能含泪舍弃其中的一部分宝物了……小FF对洞穴里的宝物进行了整理,他发现每样宝物都有一件或者多件。他粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:小FF有一个最大载重为W的采集车,洞穴里总共有n种宝物,每种宝物的价值为v[i],重量为w[i],每种宝物有m[i]件。小FF希望在采集车不超载的前提下,选择一些宝物装进采集车,使得它们的价值和最大。
【输入格式】
第一行为一个整数N和w,分别表示宝物种数和采集车的最大载重。
接下来n行每行三个整数,其中第i行第一个数表示第i类品价值,第二个整数表示一件该类物品的重量,第三个整数为该类物品数量。
【输出格式】
输出仅一个整数ans,表示在采集车不超载的情况下收集的宝物的最大价值。
【输入样例】
4 20
3 9 3
5 9 1
9 4 2
8 1 3
【输出样例】
47
【数据范圈】
对于30%的数据:n≤∑m[i]≤10^4;0≤W≤10^3。
对于100%的数据:n≤∑m[i]≤10^5;
0 <w≤4*10^4:1≤n<100。
========================================
多重背包...
===========================
type re=record v,w,n:longint; end; var n,w:longint; ti:array[1..100]of re; f:array[0..40000]of longint; procedure init; begin assign(input,'treasure.in'); assign(output,'treasure.out'); reset(input); rewrite(output); end; procedure terminate; begin close(input);close(output); halt; end; function max(a,b:longint):longint; begin if a>b then exit(a); exit(b); end; procedure main; var i,j,k:longint; amount:longint; begin readln(n,w); for i:=1 to n do begin readln(ti[i].v,ti[i].w,ti[i].n); end; fillchar(f,sizeof(f),0); for i:=1 to n do begin if ti[i].n*ti[i].w>=w then begin for j:=ti[i].w to w do f[j]:=max(f[j],f[j-ti[i].w]+ti[i].v); end else begin amount:=1; while amount<ti[i].n do begin for j:=w downto amount*ti[i].w do begin f[j]:=max(f[j],f[j-amount*ti[i].w]+ti[i].v*amount); end; ti[i].n:=ti[i].n-amount; amount:=amount*2; end; for j:=w downto ti[i].n*ti[i].w do begin f[j]:=max(f[j],f[j-ti[i].n*ti[i].w]+ti[i].v*ti[i].n); end; end; end; writeln(f[w]); end; begin init; main; terminate; end.
相关文章推荐
- 试题四:宝物筛选(Treasure.pas/c/cpp)
- 【动态规划】无聊的数列 line.pas/c/cpp
- t077宝物筛选
- 硬币找零(coin.c/cpp/pas)
- 逃亡的准备(hallows.pas/c/cpp)
- 【斐波那契的一个形式】古代人的难题( puzzle.pas/c/cpp)
- 洛谷P1776 宝物筛选_NOI导刊2010提高(02)
- 【枚舉】【數學題】澆水 (water.c/cpp/pas)
- 【归并排序】序列(sequence.pas/c/cpp)
- 【动态规划】Tom的烦恼 tom.pas/c/cpp/in/out
- 【动态规划】【排列组合】Wiseking (Wiseking.pas/c/cpp)
- 【2014.10.18普及组】道路阻塞(rblock.pas/cpp/c) //2018.1.27
- 【模拟】相似度 (similar.pas/c/cpp)
- JZOJ(中山纪中) 1983. 【普及组模拟赛】手机(mobile.pas/cpp)
- 【队列模拟】集卡片 card.pas/c/cpp
- MZ test17# NOIP模拟题 # T1 第1题 时间计算(heaven.pas/cpp)[key.模拟]
- 时间计算(heaven.pas/cpp)
- BSOI_2261.作弊的发牌者 (cheat.pas/c/cpp)
- 数塔问题(numtri.pas/c/cpp)