UVA 624 CD(DP:01背包)
2014-04-02 19:21
393 查看
UVA 624 CD(DP:01背包)
题意:有N个物品,每个物品一个重量,现在问你在重量不超过W的前提下,如何选物品可以使得装的物品尽量多,并且要按输入顺序输出被装入的物品,已经总重量sum.
分析:基础的01背包DP不过需要打印路径,需要熟练.
由于dp[i][j] = max( dp[i-1][j],dp[i-1][j-wi]+wi ).所以用一个二维数组vis[i][j]表示dp[i][j]作出的选择.而且可能存在多种选择的情况,这题目好像不考虑,总是优先维持之前已经选择的物品.
注意:由于打印物品是从前往后打印,所以选物品的时候要从后往前选,则当得到dp
[nWeight]的时候可以推出第一个物品选没选.
AC代码:
题意:有N个物品,每个物品一个重量,现在问你在重量不超过W的前提下,如何选物品可以使得装的物品尽量多,并且要按输入顺序输出被装入的物品,已经总重量sum.
分析:基础的01背包DP不过需要打印路径,需要熟练.
由于dp[i][j] = max( dp[i-1][j],dp[i-1][j-wi]+wi ).所以用一个二维数组vis[i][j]表示dp[i][j]作出的选择.而且可能存在多种选择的情况,这题目好像不考虑,总是优先维持之前已经选择的物品.
注意:由于打印物品是从前往后打印,所以选物品的时候要从后往前选,则当得到dp
[nWeight]的时候可以推出第一个物品选没选.
AC代码:
#include <iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int MAXN=10005; int weight[25]; int dp[MAXN]; int nKind,nWeight; bool vis[25][MAXN]; void ZeroOnePack() { for(int i=nKind;i>=1;i--) for(int j=nWeight;j>=weight[i];j--) { if(dp[j-weight[i]]+weight[i]>dp[j]) { dp[j] = dp[j-weight[i]]+weight[i]; vis[i][j]=true; } } } int main() { while(scanf("%d%d",&nWeight,&nKind)==2) { for(int i=1;i<=nKind;i++) scanf("%d",&weight[i]); memset(dp,0,(nWeight+1)*sizeof(dp[0])); memset(vis,false,sizeof(vis)); ZeroOnePack(); int end=nWeight; for(int i=1;i<=nKind;i++) if(vis[i][end]) { printf("%d ",weight[i]); end -=weight[i]; } printf("sum:%d\n",dp[nWeight]); } return 0; }
相关文章推荐
- Button的使用(八):点击更新时间的显示
- 基于Petri网的敏捷开发软件过程模型及实践--3.敏捷开发软件过程网
- TopCoder——HillHiker(爬山问题)
- Ubuntu 12.04的SWAP设置
- POJ 1651 Multiplication Puzzle
- IOS开发-AFNetWorking速成笔记
- Struts2的工作原理
- 类加载器---类加载机制
- 第五周项目1-5参数初始化表
- Java工厂模式
- 3.基本语法
- BAT互动娱乐大战:谁在喊口号?
- xargs
- WinCE 下进程可访问的代码页的地址获取
- 在tomcat下端口号设置后面 添加 URIEncoding=UTF-8可以使传递中文的不乱码
- JAVA语言的特点
- 在tomcat下端口号设置后面 添加 URIEncoding=UTF-8可以使传递中文的不乱码
- 环形队中实现队列的基本运算
- 第四周作业--图的表示
- 获取 WinCE 移动设备屏幕旋转方向