51Nod-1085-背包问题
2016-04-22 02:20
295 查看
在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数)。求背包能够容纳的最大价值。
Input
第1行,2个整数,N和W中间用空格隔开。N为物品的数量,W为背包的容量。(1 <= N <= 100,1 <= W <= 10000)
第2 - N + 1行,每行2个整数,Wi和Pi,分别是物品的体积和物品的价值。(1 <= Wi, Pi <= 10000)
Output
输出可以容纳的最大价值。
Input示例
3 6
2 5
3 8
4 9
Output示例
14
经典动态规划问题。
Input
第1行,2个整数,N和W中间用空格隔开。N为物品的数量,W为背包的容量。(1 <= N <= 100,1 <= W <= 10000)
第2 - N + 1行,每行2个整数,Wi和Pi,分别是物品的体积和物品的价值。(1 <= Wi, Pi <= 10000)
Output
输出可以容纳的最大价值。
Input示例
3 6
2 5
3 8
4 9
Output示例
14
经典动态规划问题。
#include <stdio.h> #define _MAX 102 #define MAX(a, b) a > b ? a : b int dp[_MAX][_MAX * _MAX]; int KanpSack(int N, int *Wi, int *Pi, int W) { int i, j; for (i = 0; i <= N; i++) { dp[i][0] = 0; } for (j = 0; j <= W; j++) { dp[0][j] = 0; } for (i = 1; i <= N; i++) { for (j = 1; j <= W; j++) { if (j < Wi[i]) { dp[i][j] = dp[i - 1][j]; } else { dp[i][j] = MAX(dp[i - 1][j], dp[i - 1][j - Wi[i]] + Pi[i]); } } } return dp [W]; } int main(int argc, const char * argv[]) { int N, W, Wi[_MAX], Pi[_MAX], i = 1; scanf("%d %d", &N, &W); for (; i <= N; i++) { scanf("%d %d", Wi + i, Pi + i); } printf("%d\n", KanpSack(N, Wi, Pi, W)); return 0; }
相关文章推荐
- LeetCode 314. Binary Tree Vertical Order Traversal(二叉树垂直遍历)
- [Perl]REAPER
- android性能优化练习:过度绘制
- LeetCode 204. Count Primes
- HDOJ(HDU) 1799 循环多少次?(另类杨辉三角)
- HDOJ(HDU) 1799 循环多少次?(另类杨辉三角)
- Power of Four leetcode 342
- java中的反射
- Unity Shaders and Effects Cookbook (4-3)遮罩反射
- python一些包
- angularjs的post请求参数的转换,使之跟ajax一样参数供springMVC使用
- 网络编程基础知识
- eclipse里访问tomcat首页出现404错误解决之法
- VM虚拟机的复制和安装windows时分区
- Java学习(九)
- 增强for循环、静态导入、可变参数、asList()方法
- 数据科学中的R和Python: 30个免费数据资源网站
- Java中的多线程
- Spark的三种分布式部署模式:Standalone, Mesos,Yarn
- SpringMVC核心类DispatcherServlet