题目:

有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。

第 i 件物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。

输出最大价值。

输入格式:

第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。

接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。

输出格式:

输出一个整数,表示最大价值。

数据范围:

\[0<N,V≤1000,
0<vi,wi≤1000
\]

输入样例:

4 5
1 2
2 4
3 4
4 5

输出样例:

8

思路:



采用闫式DP分析法、从集合角度对背包问题进行状态划分、如图所示、划分好状态代码就好写多了、最大价值数即为f[n][m]

朴素做法

#include <iostream>

using namespace std;

const int N = 1010;

int w[N], v[N];
int f[N][N];
int n, m;
int main()
{
cin >> n >> m; for(int i = 1 ; i <= n ; i ++) cin >> v[i] >> w[i]; for(int i = 1 ; i <= n ; i ++)
for(int j = 0 ; j <= m ; j ++)
{
f[i][j] = f[i - 1][j];
if(j >= v[i])
{
f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
}
} cout << f[n][m] << endl;
return 0;
}

降维度之后的写法

#include <iostream>

using namespace std;

const int N = 1010;

int n, m;
int f[N]; int main()
{
cin >> n >> m;
for (int i = 0; i < n; i ++ )
{
int v, w;
cin >> v >> w;
for (int j = m; j >= v; j -- )
f[j] = max(f[j], f[j - v] + w);
} cout << f[m] << endl; return 0;
}

最新文章

  1. win8.1 vs2010 C++环境下 编译Android Adb.exe
  2. `cocos2dx非完整` 添加xxtea加密模块
  3. [maven] 跳过单元测试
  4. 【原】rsync的详细参数
  5. 基于Hadoop生态圈的数据仓库实践 —— ETL
  6. MySQL对于datetime 源码分析
  7. CAReplicatorLayer复制Layer和动画, 实现神奇的效果
  8. 【读书笔记】《写给大忙人看的Java SE 8》——Java8新特性总结
  9. backbone入门学习一
  10. Hyperledger Fabric Transaction Flow——事务处理流程
  11. Hash算法总结(转)
  12. xss小结-从xss平台搭建到csp规则
  13. jenkins多个slave遇到的坑
  14. POJ1251 Jungle Roads【最小生成树】
  15. UIImageView的frame设置(4种方式)
  16. Jmeter测试Mysql数据库-入门篇
  17. spring mvc自定义注解--访问时验证
  18. PHP将CMYK颜色值和RGB颜色相互转换的例子
  19. 查内存命令之free
  20. Java序员的成长之路

热门文章

  1. 洛谷 P5470 - [NOI2019] 序列(反悔贪心)
  2. 自然溢出哈希 hack 方法
  3. R语言与医学统计图形-【24】ggplot位置调整函数
  4. jQuery添加html绑定事件
  5. rabbit mq的php使用 amqp 的支持
  6. SQL-关联表查询(连表查询)
  7. 15.Pow(x, n)
  8. 亿级Web系统搭建:单机到分布式集群
  9. Python查找最长回文暴力方法
  10. jsp页面中HTML注释与jsp注释的区别