题意:给出一个t代表有t组数据,然后给出n,n代表有n种石头,v代表旅行者的背包容量,然后给出n种石头的价值和容量大小,求能带走的最大价值

思路:01背包问题,每种石头只有拿与不拿两种状态、(其实我是为理解dp而来的)

 #include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
const int qq=+; //开始数值写小了 只写了100+10
int value[qq];
int weight[qq];
int dp[qq][qq];
void kill(int n,int v)
{
for(int i=;i<=n;++i)
dp[][i]=dp[i][]=;
for(int j,i=;i<=n;++i)
for(j=;j<=v;++j)
if(j<weight[i])
dp[i][j]=dp[i-][j];
else if(dp[i-][j-weight[i]]+value[i]>dp[i-][j])
dp[i][j]=dp[i-][j-weight[i]]+value[i];
else
dp[i][j]=dp[i-][j];
}
int main()
{
int t,n,v;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&v);
for(int i=;i<=n;++i)
scanf("%d",&value[i]);
for(int j=;j<=n;++j)
scanf("%d",&weight[j]);
kill(n,v);
printf("%d\n",dp[n][v]);
}
}

一维数组也能过、只是第二层必须反序来、顺序的话同一件物品可能会被取多次

 #include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int qq=;
int w[qq],v[qq];
int dp[qq];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n,m;
memset(dp,,sizeof(dp));
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
scanf("%d",&v[i]);
for(int i=;i<=n;++i)
scanf("%d",&w[i]);
for(int i=;i<=n;++i)
for(int j=m;j>=v[i];--j) //一定记得是逆序、可以自己模拟一遍
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);;
printf("%d\n",dp[m]);
}
return ;
}

贴一份WA的代码

 #include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int qq=;
int w[qq],v[qq];
int dp[qq][qq];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n,m;
memset(dp,,sizeof(dp));
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
scanf("%d",&v[i]);
for(int i=;i<=n;++i)
scanf("%d",&w[i]);
for(int i=;i<=n;++i)
for(int j=w[i];j<=m;++j) //我开始还在想为什么这样不对
dp[i][j]=max(dp[i-][j],dp[i-][j-w[i]]+v[i]);
printf("%d\n",dp[n][m]);
}
return ;
}
//先出一组数据吧、
/* 1
5 0
2 4 1 5 1
0 0 1 0 0
这样的话在dp[3]的话是根本不会进入到第二层循环的、
也就是说dp[3][0]的值为0
*/

HDU 2602Bone Collector 01背包问题的更多相关文章

  1. HDU 2602 Bone Collector (01背包问题)

    原题代号:HDU 2602 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 原题描述: Problem Description Many yea ...

  2. HDU——2602Bone Collector(01背包)

    Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  3. HDU 2955(01背包问题)

    M - 01背包 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Descript ...

  4. ACM HDU Bone Collector 01背包

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 这是做的第一道01背包的题目.题目的大意是有n个物品,体积为v的背包.不断的放入物品,当然物品有 ...

  5. HDU 2955(0-1背包问题)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87125#problem/M 题目: Description The aspir ...

  6. HDU-1864&&HDU-2602(01背包问题)

    DP-01背包问题例题 输入处理有点恶心人,不过处理完后就是简单的DP了 从头开始dp[i]表示从0开始到i的最优结果,最后从都边里dp数组,求得最大的报销额. 对于每个i都要从头维护最优结果.(二刷 ...

  7. HDU 2602 Bone Collector(经典01背包问题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2602 Bone Collector Time Limit: 2000/1000 MS (Java/O ...

  8. HDU 1864最大报销额 01背包问题

    B - 最大报销额 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit St ...

  9. HDU 3466 Proud Merchants 带有限制的01背包问题

    HDU 3466 Proud Merchants 带有限制的01背包问题 题意 最近,伊萨去了一个古老的国家.在这么长的时间里,它是世界上最富有.最强大的王国.因此,即使他们的国家不再那么富有,这个国 ...

随机推荐

  1. 【python之路13】python的深浅拷贝

    深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 impor ...

  2. Leetcode868.Binary Gap二进制间距

    给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离. 如果没有两个连续的 1,返回 0 . 示例 1: 输入:22 输出:2 解释: 22 的二进制是 0b10110 . ...

  3. IO流理解方式小结

    从业以来一直对IO不甚了解,每次看到都头疼不已,最近有时间小小的总结一下,下面以FileIO流为]; //文件输入流 FileInputStream in = new FileInputStream( ...

  4. mysql自定义function 写递归查询子节点

    #存储文本信息表 CREATE TABLE WordInfoEntity( word_id ) PRIMARY KEY NOT NULL, # 主键ID UUID word_greda :正文文本 , ...

  5. Java安全——密钥那些事

    标签(空格分隔): Java 安全 概念 密钥是加密算法不可缺少的部分.密钥在安全体系中至关重要,正如其名,私密的钥匙,打开安全的大门.密钥分两种:对称密钥和非对称密钥.非对称密钥里又包含公开密钥和私 ...

  6. jsp中的标签使用

    jsp中的变量作用域 表示变量的作用域,一共4种.pageScope:  表示变量只能在本页面使用.requestScope:表示变量能在本次请求中使用.sessionScope:表示变量能在本次会话 ...

  7. IDEA-servlet项目创建web项目

    准备:1. 安装jdk1.82. 安装tomcat9.0(idea只支持4.0  9.0的服务器) 一.创建并设置javaweb工程 1.创建javaweb工程File --> New --&g ...

  8. Oracle日期

    oracle 日期格式 to_date("要转换的字符串","转换的格式")   两个参数的格式必须匹配,否则会报错. 即按照第二个参数的格式解释第一个参数. ...

  9. NEFU 118 n!后面有多少个0【数论】

    http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=118 求n!后面有多少个0(1<=n<=1000000000) ...

  10. switch范围判断

    <?php function grade($grade){ switch (true) { case $grade>=90: echo 'A'; break; case $grade> ...