YTU 2335: 0-1背包问题
2335: 0-1背包问题
时间限制: 1 Sec 内存限制: 128 MB
提交: 15 解决: 12
题目描述
试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解0-1背包问题。 0-1 背包问题描述如下:给定n 种物品和一个背包。物品i 的重量是wi ,其价值为vi ,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
在选择装入背包的物品时,对每种物品i只有2 种选择,即装入背包或不装入背包。不能将物品i 装入背包多次,也不能只装入部分的物品i。
输入
第一行有2个正整数n和c。n是物品数,c是背包的容量。接下来的1 行中有n个正整数,表示物品的价值。第3 行中有n个正整数,表示物品的重量。
输出
将计算出的装入背包物品的最大价值和最优装入方案输出。第一行输出为:Optimal value is
样例输入
5 10
6 3 5 4 6
2 2 6 5 4
样例输出
Optimal value is
15
1 1 0 0 1
迷失在幽谷中的鸟儿,独自飞翔在这偌大的天地间,却不知自己该飞往何方……
#include<iostream>
#include<stdio.h>
using namespace std;
int ab,c,n,ji[200],h[200];
struct bag
{
int w;
int h;
} b[200];
void digui(int d,int s,int sc) //d为第几个物品,为当前价值,sc为当前所占质量
{
if(sc>c)return; //如果当前质量大于容量返回
if(d==n) //如果所有物品检验完毕
{
if(ab<s) //当前价值小于最大价值
{
ab=s;
for(int i=0; i<d; i++) //记录此时物品放置信息
h[i]=ji[i];
}
}
else for(int i=0; i<2; i++)
{
if(i==0)ji[d]=0,digui(d+1,s,sc); //不放入当前物品
else ji[d]=1,digui(d+1,s+b[d].w,sc+b[d].h); //放入当前物品
}
}
int main()
{
cin>>n>>c;
for(int i=0; i<n; i++)
cin>>b[i].w; //输入价值
for(int i=0; i<n; i++)
cin>>b[i].h; //输入重量
digui(0,0,0); //递归函数
printf("Optimal value is\n%d\n",ab);
for(int i=0; i<n; i++)
printf(i!=n-1?"%d ":"%d\n",h[i]);
return 0;
}
#include<stdio.h>
using namespace std;
int ab,c,n,ji[200],h[200];
struct bag
{
int w;
int h;
} b[200];
void digui(int d,int s,int sc) //d为第几个物品,为当前价值,sc为当前所占质量
{
if(sc>c)return; //如果当前质量大于容量返回
if(d==n) //如果所有物品检验完毕
{
if(ab<s) //当前价值小于最大价值
{
ab=s;
for(int i=0; i<d; i++) //记录此时物品放置信息
h[i]=ji[i];
}
}
else for(int i=0; i<2; i++)
{
if(i==0)ji[d]=0,digui(d+1,s,sc); //不放入当前物品
else ji[d]=1,digui(d+1,s+b[d].w,sc+b[d].h); //放入当前物品
}
}
int main()
{
cin>>n>>c;
for(int i=0; i<n; i++)
cin>>b[i].w; //输入价值
for(int i=0; i<n; i++)
cin>>b[i].h; //输入重量
digui(0,0,0); //递归函数
printf("Optimal value is\n%d\n",ab);
for(int i=0; i<n; i++)
printf(i!=n-1?"%d ":"%d\n",h[i]);
return 0;
}
YTU 2335: 0-1背包问题的更多相关文章
- 蓝桥杯 0/1背包问题 (java)
今天第一次接触了0/1背包问题,总结一下,方便以后修改.不对的地方还请大家不啬赐教! 上一个蓝桥杯的例题: 数据规模和约定 代码: import java.util.Scanner; public ...
- 经典递归问题:0,1背包问题 kmp 用遗传算法来解背包问题,hash表,位图法搜索,最长公共子序列
0,1背包问题:我写笔记风格就是想到哪里写哪里,有很多是旧的也没删除,代码内部可能有很多重复的东西,但是保证能运行出最后效果 '''学点高大上的遗传算法''' '''首先是Np问题的定义: npc:多 ...
- Java实现动态规划法求解0/1背包问题
摘要: 使用动态规划法求解0/1背包问题. 难度: 初级 0/1背包问题的动态规划法求解,前人之述备矣,这里所做的工作,不过是自己根据理解实现了一遍,主要目的还是锻炼思维和编程能力,同时,也是为了增进 ...
- 0/1背包问题(DP)
Description 给定 n 个物品和一个背包.物品 i 的重量是 wi ,其价值为 vi ,背包的容量为 C .问:应该如何选择装入背包的物品,使得装入背包中物品的总价值最大? Input 输入 ...
- hdu2602Bone Collector ——动态规划(0/1背包问题)
Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collec ...
- 【Python】0/1背包、动态规划
0/1背包问题:在能承受一定重量的背包中,放入重量不同,价值不同的几件物品,怎样放能让背包中物品的价值最大? 比如,有三件物品重量w,价值v分别是 w=[5,3,2] v=[9,7,8] 包的容量是5 ...
- 使用LINGO来解决0/1背包算法问题
1.问题说明 0/1背包问题:我们有n种物品,物品j的重量为wj,价格为pj.我们假定所有物品的重量和价格都是非负的.背包所能承受的最大重量为W.如果限定每种物品只能选择0个或1个,则问题称为0-1背 ...
- HDU 2602 Bone Collector 0/1背包
题目链接:pid=2602">HDU 2602 Bone Collector Bone Collector Time Limit: 2000/1000 MS (Java/Others) ...
- 动态规划-背包问题 Knapsack
2018-03-15 13:11:12 背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何 ...
随机推荐
- [Call Vibrator] How to Enable Outgoing Call Vibration without ROOT
Call Vibrator requires the radio log of phone to detect when outgoing call is answered. But since An ...
- checkbox判断选中
$("input[type='checkbox']").is(':checked')
- 基于jdk proxy的动态代理模式
代理模式 是spring AOP机制的实现基础,有必要学习一下. 有两种,一种是目标类有接口的, 采用JDK动态代理,一种是目标类没接口的,采用CGLIB动态代理. 先看一组代码, package c ...
- Ruby On Rails经典书籍下载地址
Web开发敏捷之道-应用Rails进行敏捷Web开发 http://vdisk.weibo.com/s/t47M5Q3WInwc RUBY ON RAILS入门经典 http://downlo ...
- C#: enum
C#的枚举类型跟C++差不多,一般我们将enum设为单个状态,比如enum color_t { RED, BLACK, GREEN}, 只能选择一个 而有的时候枚举可以作为位运算来进行与或运算,比如C ...
- extjs实现简单的多文件上传(不借助任何插件),以及包含处理上传大文件的错误的各种处理办法
在extjs的学习过程中,有遇到过有关多文件上传的问题,但是网上的大多数都是专门的去实现多文件上传而去做的组件之类的,没有特别简单的方式,于是小白便做了下面的内容,只是通过动态的去添加extjs的自带 ...
- javascript浏览器对象
window对象 1.window对象 window对象是BOM的核心,window对象指当前的浏览器窗口 所有JS全局对象.函数以及变量均自动成为window对象的成员 全局变量是window对象的 ...
- 构造方法特点,void
构造方法特点: 1.和类有相同的名字 2.无返回值 3.被默认强制void void作用:====>>说明声明的方法没有返回值 构造方法作用: -->初始化实例属性 -->用于 ...
- YbRapidSolution.Mvc判断不同用户登录不同页面
AccountController.cs using System; using System.Collections.Generic; using System.Linq; using System ...
- java 中多线程和锁的使用
关键词: implements 实现 Runnable 类 run() 方法 注意点 : 创建类的实例 InterfaceController inter=new InterfaceContro ...