【贪心】0/1背包
2016-07-22 10:59
351 查看
贵有恒,何必三更起五更眠;最无益,莫过一日曝十日寒。
问题 P: 【贪心】0/1背包【贪心】0/1背包
时间限制: 1 Sec 内存限制: 128 MB题目描述
有一容量为weight的背包。现在要从n件物品中选取若干装入背包中,每件物品i的重量为w[i],价值为p[i]。定义一种可行的背包装载为:背包中物品的总重量不能超过背包的容量,并且一个物品要么全部选取,要么不选取。定义最佳装载是指所装入的物品价值最高,并且是可行的背包装载。输入
第1行一个整数,表示背包的重量weight 第2行一个整数,表示n件物品 第3行有n个整数,分别表示n个物品的重量 第4行有n个整数,分别表示n个物品的价值输出
共两行。第1行n个物品的选取状态,0表示不取,1表示取。n个状态用空格分隔,行尾无空格。第2行表示装入物品的最高价值。样例输入
11 4 2 4 6 7 6 10 12 13
样例输出
0 1 0 1 23
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int lm,n,weight,w[1111],v[1111],last[1111],dlast[1111]; void ss(int i,int dm,int dw) { /* i——第i个物品 dm——当前的最大价值 dw——当前的重量 */ if(i<n) { dlast[i]=0; ss(i+1,dm,dw); if(weight>=dw+w[i]) { dm+=v[i]; dw+=w[i]; dlast[i]=1; ss(i+1,dm,dw); } } else { if(dm>lm) { for(int i=0;i<n;i++) last[i]=dlast[i]; lm=dm; } } } int main() { while(cin>>weight>>n) { lm=0; memset(last,0,sizeof(last)); memset(dlast,0,sizeof(dlast)); for(int i=0;i<n;i++) cin>>w[i]; for(int i=0;i<n;i++) cin>>v[i]; ss(0,0,0); for(int i=0;i<n;i++) { if(i==n-1) //行尾不能有空格 { cout<<last[i]<<endl; break; } cout<<last[i]<<" "; } cout<<lm<<endl; } return 0; }
相关文章推荐
- Search in Rotated Sorted Array I & II
- idea 自动生成测试代码junit设置到maven标准测试目录
- POJ 2114 Boatherds 树分治
- PAT-B 1028. 人口普查
- Android动画--属性动画--基础
- 第一天开通博客
- app.use()方法
- ios tableview 自动计算cell高度
- 如何理解混合云
- 【腾讯Bugly干货分享】React移动web极致优化
- hive-学习笔记
- MySQL开发规范
- HDOJ 2037之今年暑假不AC
- Star(锐角三角形)
- CSS RESET简述
- PAT-B 1027. 打印沙漏
- Java 中的类锁和对象锁
- 数据库智能提示和源代码管理工具(支持SVN)SQLPrompt_7.0.0.40, RedGate_SQL_SourceControl.V3.0.13.4214
- 【札记】SUSE Linux(SLES 11为例)下常用维护命令,文件大小、查找内容、统计、打包、远程拷贝、FTP、SSH
- C语言 随机函数 种子