HDU 2602Bone Collector 01背包问题
题意:给出一个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背包问题的更多相关文章
- HDU 2602 Bone Collector (01背包问题)
原题代号:HDU 2602 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 原题描述: Problem Description Many yea ...
- HDU——2602Bone Collector(01背包)
Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU 2955(01背包问题)
M - 01背包 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descript ...
- ACM HDU Bone Collector 01背包
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 这是做的第一道01背包的题目.题目的大意是有n个物品,体积为v的背包.不断的放入物品,当然物品有 ...
- HDU 2955(0-1背包问题)
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87125#problem/M 题目: Description The aspir ...
- HDU-1864&&HDU-2602(01背包问题)
DP-01背包问题例题 输入处理有点恶心人,不过处理完后就是简单的DP了 从头开始dp[i]表示从0开始到i的最优结果,最后从都边里dp数组,求得最大的报销额. 对于每个i都要从头维护最优结果.(二刷 ...
- HDU 2602 Bone Collector(经典01背包问题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2602 Bone Collector Time Limit: 2000/1000 MS (Java/O ...
- HDU 1864最大报销额 01背包问题
B - 最大报销额 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit St ...
- HDU 3466 Proud Merchants 带有限制的01背包问题
HDU 3466 Proud Merchants 带有限制的01背包问题 题意 最近,伊萨去了一个古老的国家.在这么长的时间里,它是世界上最富有.最强大的王国.因此,即使他们的国家不再那么富有,这个国 ...
随机推荐
- 【python之路13】python的深浅拷贝
深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 impor ...
- Leetcode868.Binary Gap二进制间距
给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离. 如果没有两个连续的 1,返回 0 . 示例 1: 输入:22 输出:2 解释: 22 的二进制是 0b10110 . ...
- IO流理解方式小结
从业以来一直对IO不甚了解,每次看到都头疼不已,最近有时间小小的总结一下,下面以FileIO流为]; //文件输入流 FileInputStream in = new FileInputStream( ...
- mysql自定义function 写递归查询子节点
#存储文本信息表 CREATE TABLE WordInfoEntity( word_id ) PRIMARY KEY NOT NULL, # 主键ID UUID word_greda :正文文本 , ...
- Java安全——密钥那些事
标签(空格分隔): Java 安全 概念 密钥是加密算法不可缺少的部分.密钥在安全体系中至关重要,正如其名,私密的钥匙,打开安全的大门.密钥分两种:对称密钥和非对称密钥.非对称密钥里又包含公开密钥和私 ...
- jsp中的标签使用
jsp中的变量作用域 表示变量的作用域,一共4种.pageScope: 表示变量只能在本页面使用.requestScope:表示变量能在本次请求中使用.sessionScope:表示变量能在本次会话 ...
- IDEA-servlet项目创建web项目
准备:1. 安装jdk1.82. 安装tomcat9.0(idea只支持4.0 9.0的服务器) 一.创建并设置javaweb工程 1.创建javaweb工程File --> New --&g ...
- Oracle日期
oracle 日期格式 to_date("要转换的字符串","转换的格式") 两个参数的格式必须匹配,否则会报错. 即按照第二个参数的格式解释第一个参数. ...
- NEFU 118 n!后面有多少个0【数论】
http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=118 求n!后面有多少个0(1<=n<=1000000000) ...
- switch范围判断
<?php function grade($grade){ switch (true) { case $grade>=90: echo 'A'; break; case $grade> ...