题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1085

题意: 中文题诶~

思路: 01背包模板题.

用dp[i][j]表示到第i个物品花去j空间能存储的最大价值, 那么很显然有

 for(int i=; i<=n; i++){
for(int j=; j<=m; j++){ //注意这里的j是从0开始而非a[i]
if(j>=a[i]){
dp[i][j]=max(dp[i-][j-a[i]]+b[i], dp[i-][j]);
}else{
dp[i][j]=dp[i-][j];
}
}
}

ac代码:

 #include <bits/stdc++.h>
#define MAXN 110
#define MAN 10010
using namespace std; int dp[MAXN][MAN]; //dp[i][j]表示到第i个物品花去j空间能存储的最大价值 int main(void){
int n, m, a[MAXN], b[MAXN]; //n为物品数量, m为背包容量, a, b分别存储物品的体积和价值
scanf("%d%d", &n, &m);
for(int i=; i<=n; i++){
scanf("%d%d", &a[i], &b[i]);
}
memset(dp, , sizeof(dp));
for(int i=; i<=n; i++){
for(int j=; j<=m; j++){
if(j>=a[i]){
dp[i][j]=max(dp[i-][j-a[i]]+b[i], dp[i-][j]);
}else{
dp[i][j]=dp[i-][j];
}
}
}
printf("%d\n", dp[n][m]);
return ;
}

我们也可以只开一维数组, 用dp[j]表示花了j空间后最大可以装的价值

那么代码我们可以写成:

 #include <bits/stdc++.h>
#define MAXN 10010
using namespace std; int dp[MAXN]; //dp[j]表示花去j空间能存储的最大价值 int main(void){
int n, m, a[MAXN], b[MAXN]; //n为物品数量, m为背包容量, a, b分别存储物品的体积和价值
scanf("%d%d", &n, &m);
for(int i=; i<=n; i++){
scanf("%d%d", &a[i], &b[i]);
}
memset(dp, , sizeof(dp));
for(int i=; i<=n; i++){
for(int j=m; j>=a[i]; j--){ //这里是从后往前推的
dp[j]=max(dp[j-a[i]]+b[i], dp[j]);
}
}
printf("%d\n", dp[m]);
return ;
}

51nod1085(01背包)的更多相关文章

  1. 【模板】51Nod--1085 01背包

    在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2--Wn(Wi为整数),与之相对应的价值为P1,P2--Pn(Pi为整数).求背包能够容纳的最大价值. Input 第1行,2个整数 ...

  2. 51Nod1085 0-1背包(一维和二维数组实现)

    背包是典型的动态规划问题,关于背包问题的详解,推荐博客:点击打开链接(这篇博客有点错误,代码for循环里错了,不过讲解 的很详细) 题目如下: 在N件物品取出若干件放在容量为W的背包里,每件物品的体积 ...

  3. UVALive 4870 Roller Coaster --01背包

    题意:过山车有n个区域,一个人有两个值F,D,在每个区域有两种选择: 1.睁眼: F += f[i], D += d[i] 2.闭眼: F = F ,     D -= K 问在D小于等于一定限度的时 ...

  4. POJ1112 Team Them Up![二分图染色 补图 01背包]

    Team Them Up! Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7608   Accepted: 2041   S ...

  5. Codeforces 2016 ACM Amman Collegiate Programming Contest A. Coins(动态规划/01背包变形)

    传送门 Description Hasan and Bahosain want to buy a new video game, they want to share the expenses. Ha ...

  6. *HDU3339 最短路+01背包

    In Action Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  7. codeforces 742D Arpa's weak amphitheater and Mehrdad's valuable Hoses ——(01背包变形)

    题意:给你若干个集合,每个集合内的物品要么选任意一个,要么所有都选,求最后在背包能容纳的范围下最大的价值. 分析:对于每个并查集,从上到下滚动维护即可,其实就是一个01背包= =. 代码如下: #in ...

  8. POJ 3624 Charm Bracelet(01背包)

    Charm Bracelet Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34532   Accepted: 15301 ...

  9. (01背包变形) Cow Exhibition (poj 2184)

    http://poj.org/problem?id=2184   Description "Fat and docile, big and dumb, they look so stupid ...

随机推荐

  1. Android开发之XUtils框架使用和报错处理

    一.XUtils  lib的的添加: 1.点击+,选择第一个Library dependency 2.输入XUtils 按enter键,搜索: 3.然后就是选择XUtils,选择哪个版本就看个人了,接 ...

  2. Redis 学习(二)

    Redis可以存储以下5种数据类型 1. String 字符串 整数 浮点 2. List   一个链表 3. Set  无序收集器 4. Hash  无序散列表 5. Zset   有序集合

  3. poj1986 LCA

    Distance Queries Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 11759   Accepted: 4157 ...

  4. css 拾遗

    1, 实现尖角 <style> .up{ border-top: 30px solid red; border-right:30px solid gold; border-bottom:3 ...

  5. [转]<jsp:include>和<%@include%>的区别

    首先,转发自yangbobo1992的 <jsp:include>和<%@include%>的区别 这个是我见过写的最好的之一 <%@include%>和<j ...

  6. FFT小总结

    FFT实质上做的是循环卷积,ck=sigam(ai*bj,(i+j)%n=k),其中n是倍长后的长度,所以我们有时候需要的只是普通的卷积,我们就需要把原数组倍长,再用FFT求卷积,由于高位都是0,所以 ...

  7. [bigdata] Spark RDD整理

    1. RDD是什么RDD:Spark的核心概念是RDD (resilient distributed dataset),指的是一个只读的,可分区的弹性分布式数据集,这个数据集的全部或部分可以缓存在内存 ...

  8. Xcode6 管理provisioning profile

    profile文件的存放位置为 /Users/用户名/Library/MobileDevice/Provisioning Profiles 更新profile文件后,Code Signing Iden ...

  9. 解决Spring MVC @ResponseBody返回中文字符串乱码问题

    spring mvc使用的默认处理字符串编码为ISO-8859-1 解决方法: 第一种方法: 对于需要返回字符串的方法添加注解,如下: @RequestMapping(value="/use ...

  10. JavaScript中的正则表达式(终结篇)

    JavaScript中的正则表达式(终结篇) 在之前的几篇文章中,我们了解了正则表达式的基本语法,但那些语法不是针对于某一个特定语言的.这篇博文我们将通过下面几个部分来了解正则表达式在JavaScri ...