杭电2602-Bone Collector

2024-05-11 03:58
文章标签 杭电 bone collector 2602

本文主要是介绍杭电2602-Bone Collector,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Bone Collector

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 20964    Accepted Submission(s): 8388


Problem Description
Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave …
The bone collector had a big bag with a volume of V ,and along his trip of collecting there are a lot of bones , obviously , different bone has different value and different volume, now given the each bone’s value along his trip , can you calculate out the maximum of the total value the bone collector can get ?

 

Input
The first line contain a integer T , the number of cases.
Followed by T cases , each case three lines , the first line contain two integer N , V, (N <= 1000 , V <= 1000 )representing the number of bones and the volume of his bag. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.
 

Output
One integer per line representing the maximum of the total value (this number will be less than 231).
 

Sample Input
  
1 5 10 1 2 3 4 5 5 4 3 2 1
 

Sample Output
  
14
/*
下面是思路的基本过程
问题的特点是:每种物品一件,可以选择放1或不放0。
用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
这个方程非常重要,据说基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以详细的查了一下这个方程的含义:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。
在有的地方看到的背包问题题目中,有两种不太相同的问法。有的题目要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背包装满。一种区别这两种问法的实现方法是在初始化的时候有所不同。
如果是第一种问法,要求恰好装满背包,那么在初始化时除了f[0]为0其它f[1..V]均设为-∞,这样就可以保证最终得到的f[N]是一种恰好装满背包的最优解。
如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将f[0..V]全部设为0。
为什么呢?可以这样理解:初始化的f数组事实上就是在没有任何物品可以放入背包时的合法状态。如果要求背包恰好装满,那么此时只有容量为0的背包可能被价值为0的nothing“恰好装满”,其它容量的背包均没有合法的解,属于未定义的状态,它们的值就都应该是-∞了。如果背包并非必须被装满,那么任何容量的背包都有一个合法解“什么都不装”,这个解的价值为0,所以初始时状态的值也就全部为0了。
小结
01背包问题是最基本的背包问题,它包含了背包问题中设计状态、方程的最基本思想,另外,别的类型的背包问题往往也可以转换成01背包问题求解。故仔细体会上面基本思路的得出方法,状态转移方程的意
*/
#include<iostream>
const int MAX=1001;
int DP[MAX][MAX];//DP[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值
int jiazhi[MAX];
int tiji[MAX];
using namespace std;
int main()
{int t,n,v,i,j;cin>>t;while(t--){cin>>n>>v;for(i=1;i<=n;i++)cin>>jiazhi[i];for(i=1;i<=n;i++)cin>>tiji[i];memset(DP,0,sizeof(DP));for(i=1;i<=n;i++){for(j=0;j<=v;j++)//这里注意!!骨头体积可以为0,背包容量也可以为0 {if(j>=tiji[i]){if(DP[i-1][j]<(DP[i-1][j-tiji[i]]+jiazhi[i]))DP[i][j]=DP[i-1][j-tiji[i]]+jiazhi[i];elseDP[i][j]=DP[i-1][j];}elseDP[i][j]=DP[i-1][j];}}cout<<DP[n][v]<<endl;}return 0;
}


这篇关于杭电2602-Bone Collector的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/978442

相关文章

杭电 2044 一只小蜜蜂...

http://acm.hdu.edu.cn/showproblem.php?pid=2044 f[1]表示相差一时的路线数 #include<stdio.h>int main(){int n,a,b,i;__int64 f[50];scanf("%d",&n);f[1] = 1;f[2] = 2;for(i = 3;i < 50;i++)f[i] = f[i-1]+f[i-2]; wh

杭电ACM hdu 2110 Crisis of HDU 解题报告(母函数)

Problem Description 话说上回讲到HDU大战东洋小苟,结果自然是中方大胜,这一战也使得海东集团在全球同行业中的地位更加巩固。随着集团的发展,很多创业时期的元老逐步功成身退,先是8600移民海外,然后是linle夫妇退隐山林,逐渐的,最初众多的元老只剩下XHD夫妇和Wiskey三人了。 到了2020年,因为扩张过度加上老鼠数量逐年减少,公司的发展遇到了前所未有的危机,此时集团已经

杭电ACM hdu 2082 找单词 解题报告(母函数)

Problem Description 假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26。那么,对于给定的字母,可以找到多少价值<=50的单词呢?单词的价值就是组成一个单词的所有字母的价值之和,比如,单词ACM的价值是1+3+14=18,单词HDU的价值是8+4+21=33。(组成的单词与排列顺序无关,比如

杭电ACM hdu 2079 选课时间 解题报告(母函数)

Problem Description 又到了选课的时间了,xhd看着选课表发呆,为了想让下一学期好过点,他想知道学n个学分共有多少组合。你来帮帮他吧。(xhd认为一样学分的课没区别)   Input 输入数据的第一行是一个数据T,表示有T组数据。 每组数据的第一行是两个整数n(1 <= n <= 40),k(1 <= k <= 8)。 接着有k行,每行有两个整数a(1 <= a <= 8),b

杭电ACM 2018

http://acm.hdu.edu.cn/showproblem.php?pid=2018 首先得抽象出问题的数学公式! #include <iostream>using namespace std;int main(void){ //f1:活了1年的小牛//f2:活了2年的小牛//f3:活了3年的小牛//f :老牛int f1, f2, f3, f;int m;cin

杭电ACM 2015 偶数求和

偶数求和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 26480 Accepted Submission(s): 11486 Problem Description 有一个长度为n(n<=100)的数列,该数列定义为从2开

选课时间 杭电ACM Java

选课时间(题目已修改,注意读题 Problem Description 又到了选课的时间了,xhd看着选课表发呆,为了想让下一学期好过点,他想知道学n个学分共有多少组合。你来帮帮他吧。(xhd认为一样学分的课没区别) Input 输入数据的第一行是一个数据T,表示有T组数据。 每组数据的第一行是两个整数n(1 <= n <= 40),k(1 <= k <=

杭电OJ 1233 还是畅通工程

杭电OJ 1233 还是畅通工程 题目链接 Problem Description某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。 Input测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N

并查集专题 杭电OJ1232 灵巧求并和路径压缩

并查集也叫不相交集合,可以描述把一个集合通过等价关系(满足自反性、对称性和传递性的关系)划分为若干个等价类这一过程。并查集只有两个操作:find 和 union。find 返回一个元素所属的等价类,union 合并两个元素所在的等价类。 本文以杭电OJ1232题为例,说明并查集的实现和两种优化(按秩合并和路径压缩)(题目链接)。 竞赛向的板子 const int N=10010;int f

hdu1010_tempter_of_the_Bone(dfs减枝)

题目大意:在一个矩阵之中从S到D在规定的时间到达,不能走回头路。题目的连接hdu1010 解题思路:因为到达的时间是固定的,因此使用广度优先遍历是不行的,广度优先遍历只能找到由S到达D的最小时间而不能找到规定的时间。因此要使用深度优先遍历,而深度优先遍历要注意减枝来提高最终的效率。 设当前的坐标为i,j。那么由当前位置到终点 (ex,ey)的最短距离为以两个点为对角线的矩形的长和宽之和减2,或