博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2602 Bone Collector - from lanshui_Yang
阅读量:6246 次
发布时间:2019-06-22

本文共 1647 字,大约阅读时间需要 5 分钟。

       题目大意:有n件物品,每件物品均有各自的价值和体积,给你一个容量为 V 的背包,问这个背包最多能装的物品的价值是多少?
       解题思路:这是一道0 - 1 背包的简单模板题,也是基础的DP问题,状态转移方程 
                     f[i][j] = max{ f[ i - 1 ][j] , f[ i - 1 ][ j - v[i] ] + w[i]  }
        边界条件:f[0][0] = f[0][1] = ……  = f[0][ V ] = 0 ;   
这是我的第一道DP,为了纪念一下,我练习了三种解法,如有错误,敬请读者指出。
#include 
#include
#include
#include
#include
#include
using namespace std;const int MAXN = 1111 ;int n , V ;int w[MAXN] ; // 物品的价值int v[MAXN] ; // 物品自身的体积int f[MAXN][MAXN] ;bool vis[MAXN][MAXN] ;int f2[MAXN] ;void init(){ scanf("%d%d" , &n , &V) ; int i ; for(i = 1 ; i <= n ; i ++) { scanf("%d" , &w[i]) ; } for(i = 1 ; i <= n ; i ++) { scanf("%d" , &v[i]) ; }}void solve1() // 普通解法{ int i , j ; for(j = 0 ; j <= V ; j ++) { f[0][j] = 0 ; } for(i = 1 ; i <= n ; i ++) { for(j = 0 ; j <= V ; j ++) { f[i][j] = f[i - 1][j] ; if(j >= v[i]) f[i][j] = max(f[i - 1][j] , f[i - 1][j - v[i]] + w[i]) ; } } printf("%d\n" , f[n][V]) ;}void solve2() // 滚动数组解法{ memset(f2 , 0 , sizeof(f2)) ; int i , j ; for(i = 1 ; i <= n ; i ++) { for(j = V ; j >= 0 ; j --) { if(j >= v[i]) f2[j] = max(f2[j] , f2[ j - v[i] ] + w[i]) ; } } printf("%d\n" , f2[V]) ;}int dp(int i , int j){ int& ans = f[i][j] ; if(vis[i][j]) return f[i][j] ; if(i == 0) ans == 0 ; else { ans = dp(i - 1 , j) ; if(j >= v[i]) ans = max(dp(i - 1 , j) , dp(i - 1 , j - v[i]) + w[i] ) ; } vis[i][j] = true ; return ans ;}void solve3() // 用记忆化搜索(memoization)求解,完全按照状态转移方程来写,较易理解。{ memset(vis , 0 , sizeof(vis)) ; // 初始化标记数组 printf("%d\n" , dp(n , V)) ;}int main(){ int T ; scanf("%d" , &T) ; while (T --) { init() ; solve1() ; solve2() ; //solve3() ; } return 0 ;}

 

转载地址:http://sroia.baihongyu.com/

你可能感兴趣的文章
SQLServer 2008 R2 清空日志文件
查看>>
总结第八天
查看>>
向空对象添加数据以及for in 遍历
查看>>
基础才是重中之重~理解内存中的栈和堆
查看>>
js错误问题 The operation is insecure.
查看>>
第四章 表达式
查看>>
Python数值计算:一 使用Pylab绘图(3)
查看>>
python爬虫知识点总结(十八)Scrapy框架基本使用
查看>>
限制textarea的字数(包括复制粘贴)
查看>>
ArcGIS Server中的各种服务
查看>>
HIVE: Transform应用实例
查看>>
Some examples about how to write anonymous method and lambda expression
查看>>
linux下可以禁用的一些服务
查看>>
aria2的下载配置
查看>>
C++扬帆远航——14(求两个数的最大公约数)
查看>>
django-blog-zinna搭建个人blog
查看>>
as3 文本竖排效果实现
查看>>
Window下Eclipse+Tomcat远程调试
查看>>
夜间模式的开启与关闭,父模板的制作
查看>>
2016/4/19
查看>>