ACM集训day15——DP
来源:互联网 发布:js isnan函数 编辑:程序博客网 时间:2024/06/05 03:34
7.25
01背包引入讲了动态规划DP
首先会有个疑问:贪心思想不能做吗?确实不能。01背包放东西只有放或不放,没有像贪心题那样可以放几分之几。而且,举个例子:3个物品大小分别是3,3,7,价值分别是6,6,10,如果背包大小是10,按贪心来做 价值/大小 降序就取得最大价值是6+6,然而明显是取6+10价值更高
经典例题:01背包
hdu2602
#include<stdio.h>#include<math.h>#include<stdlib.h>#include<iostream>#include<algorithm>#include<string.h>#include<malloc.h>#include<vector>#include<queue>#include<stack>using namespace std;int val[1005];int vol[1005];int dp[1005][1005]; /*表示前i件物品放到容量为j的背包的最大价值。如果放到主函数里面运行会崩溃,**数组开到超过6个零就放出去**,尽量大数都放出去*/int main(){ int t; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp)); int n,v; scanf("%d%d",&n,&v); for(int i=1;i<=n;i++) //从1开始,前i件嘛 scanf("%d",&val[i]); for(int i=1;i<=n;i++) //从1开始 scanf("%d",&vol[i]); for(int i=1;i<=n;i++) for(int j=0;j<=v;j++) /*二层从0开始,要和后面dp[i][j-vol[i]]+val[i](j=vol[i])的情况比较*/ { if(j>=vol[i]) dp[i][j]=max(dp[i-1][j],dp[i-1][j-vol[i]]+val[i]); else dp[i][j]=dp[i-1][j]; } printf("%d\n",dp[n][v]); } return 0;}
优化一下空间复杂度,用一维数组dp[]
#include<stdio.h>#include<math.h>#include<stdlib.h>#include<iostream>#include<algorithm>#include<string.h>#include<malloc.h>#include<vector>#include<queue>#include<stack>using namespace std;int val[1005];int vol[1005]; /*表示前i件物品放到容量为j的背包的最大价值。如果放到主函数里面运行会崩溃,**数组开到超过6个零就放出去**,尽量大数都放出去*/int main(){ int t; scanf("%d",&t); while(t--) { int n,v; scanf("%d%d",&n,&v); int dp[1005]; for(int i=0;i<=v;i++) dp[i]=0; for(int i=1;i<=n;i++) //从1开始 scanf("%d",&val[i]); for(int i=1;i<=n;i++) //从1开始 scanf("%d",&vol[i]); for(int i=1;i<=n;i++) for(int j=v;j>=0;j--) /*要从v开始倒过来,才能保证推f[v]时f[v-c[i]]保存的是状态f[i-1][v-c[i]]的值(取前i-1物品最优状态,打个表清晰明了),详见《背包九讲》博文()*/ { if(j>=vol[i]) dp[j]=max(dp[j],dp[j-vol[i]]+val[i]);/*与二维的转移方程同价*/ } printf("%d\n",dp[v]); } return 0;}
优化后,同是C++,时间和内存都优化了不少,G++更优一些
下午机房空调崩了….
dp代码都不难写,但有时候很难想得通,思想很重要,这才是刚刚开始…dp在acm比赛中非常重要,一定要学好
0 0
- ACM集训day15——DP
- ACM集训——POJ_1008
- ACM集训——POJ_1107
- ACM暑期集训——专题一[DP最大子序列]
- ACM集训——盲打训练
- **ACM集训day12——bfs队列
- XYNU—ACM暑假集训第一次测试
- XYNU—ACM暑假集训第二次测试
- ACM 学习心得 ——2014年ACM暑假集训有感
- ACM集训——01背包——POJ3624
- 2015郑州大学ACM暑期集训——第三天
- ACM暑期集训——专题一[优先队列]
- ACM暑期集训——专题一[DFS]
- ACM暑期集训——专题一[BFS]
- ACM暑期集训——专题一[DFS回溯法]
- ACM集训日记——7月31
- ACM集训日记—8月1日
- XYNU—ACM暑假集训第四次测试 STL
- JAVA的23种设计模式
- POJ 1035 Spell checker【字符串暴力处理】
- 网络数据请求
- 机器学习第2周编程作业
- Context上下文
- ACM集训day15——DP
- UVa 1630 太难了惭愧啊。
- 实习笔记(三)
- 前端使用FormData实现上传文件
- 图片转化成base64字符串
- UVALive 6442 Coins on a Ring (思维题)
- mysql在linux上出现Access denied for user 'root'@'localhost' (using password: NO)解决方案
- hdu 1068 Girls and Boys(最大独立集模板)
- 数据结构之线段树