0-N背包为题(动态规划算法)
/****************0-N背包问题******************
* 有n个物体装入容量为c的背包,每一个物体有一个体积
* 和一个价值,所装入的物体体积之和不大于背包体积,
* 且每个物体可以多次装入,即每个物体有很多个(与0-1
* 背包问题的区别),求装入的最大价值?
* *****************************************/
/********************************************
* Author:ChengSong
* Time:2015/12/29 22:24
* language:C++
* alogrithm: Dynamic Programing(动态规划)
* *****************************************/
#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
int knapsack0N(int goodsnum,int capacity,int *weight,int *value,int **result,int *count){
for(int i=;i<goodsnum+;++i)result[i][] = ;//容量为0的时候result[i][0] =0
for(int j=;j<capacity+;++j)result[][j] = ;//没有物体时候result[0][j] = 0
/*递归求解结果集result*/
for(int i=;i<goodsnum+;++i)
for(int j=;j<capacity+;++j)
{
if(weight[i]>j){//当第i个物体的重量weight[i]大于背包重量j时
result[i][j] = result[i-][j];
}
else{//当物体的重量小于等于背包重量时
int max_k = j/weight[i];//max_k为当前背包容量为j时最多可装入物体i的个数
int t = result[i-][j];
for(int k=;k<max_k+;++k){//循环求解出result[i-1][j]与result[i-1][j-k*weight[i]]+k*value[i]的最大的一个(k=1...max_k)
if(t<result[i-][j-k*weight[i]]+k*value[i]){
t = result[i-][j-k*weight[i]]+k*value[i];
}
}
result[i][j] = t;//当前t 为result[i-1][j]与result[i-1][j-k*weight[i]]+k*value[i]的最大的一个(k=1...max_k)
}
}
return result[goodsnum][capacity];//返回最后结果:容量为capacityd背包装入goodsnum种物体的最大值
} int main(){
int goodsnum,capacity;//物体个数与背包容量
cin>>goodsnum>>capacity;
int *count = new int[goodsnum+];
for(int i=;i<goodsnum+;++i)
count[i] = ;//每个物体放入的个数,初始化为0
int *weight = new int[goodsnum+];
int *value = new int[goodsnum+];
int **result = new int*[goodsnum+];//结果集,result[i][j]表示有i类物体放入容量为j的背包内的最大价值
for(int i=;i<goodsnum+;i++)
result[i] = new int[capacity+];
for(int i=;i<goodsnum+;++i){
cin>>weight[i]>>value[i];
}
cout<<knapsack0N(goodsnum,capacity,weight,value,result,count)<<endl;
/*该循环用来计算每个物体装入的个数*/
for(int i=goodsnum;i>;){
if(result[i][capacity]==result[i-][capacity])//该条件下物体i不装入,count[i]不变,i--
i--;
else{
//该条件下物体i可以装入数目增加一个,i不变,在进入循环,看看i物体是否还能在装入
count[i]++;
capacity -= weight[i];
}
}
//将装入个数不为0的物体输出,并输出该物体装入的个数
for(int i=;i<goodsnum+;i++){
if(count[i]!=)
cout<<i<<" "<<count[i]<<endl;
}
return ; }
0-N背包为题(动态规划算法)的更多相关文章
- 0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论
一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i ...
- 【Python】0/1背包、动态规划
0/1背包问题:在能承受一定重量的背包中,放入重量不同,价值不同的几件物品,怎样放能让背包中物品的价值最大? 比如,有三件物品重量w,价值v分别是 w=[5,3,2] v=[9,7,8] 包的容量是5 ...
- 动态规划算法详解 Dynamic Programming
博客出处: https://blog.csdn.net/u013309870/article/details/75193592 前言 最近在牛客网上做了几套公司的真题,发现有关动态规划(Dynamic ...
- 算法(Java实现)—— 动态规划算法
动态规划算法 应用场景-0-1背包问题 背包问题:有一个背包,容量为4磅,现有物品如下 物品 重量 价格 吉他(G) 1 1500 音响(S) 4 3000 电脑(L) 3 2000 要求: 达到目标 ...
- 从最长公共子序列问题理解动态规划算法(DP)
一.动态规划(Dynamic Programming) 动态规划方法通常用于求解最优化问题.我们希望找到一个解使其取得最优值,而不是所有最优解,可能有多个解都达到最优值. 二.什么问题适合DP解法 如 ...
- 动态规划 算法(DP)
多阶段决策过程(multistep decision process)是指这样一类特殊的活动过程,过程可以按时间顺序分解成若干个相互联系的阶段,在每一个阶段都需要做出决策,全部过程的决策是一个决策序列 ...
- CJOJ 2040 【一本通】分组背包(动态规划)
CJOJ 2040 [一本通]分组背包(动态规划) Description 一个旅行者有一个最多能用V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2, ...
- CJOJ 2307 【一本通】完全背包(动态规划)
CJOJ 2307 [一本通]完全背包(动态规划) Description 设有n种物品,每种物品有一个重量及一个价值.但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干 ...
- 剑指Offer——动态规划算法
剑指Offer--动态规划算法 什么是动态规划? 和分治法一样,动态规划(dynamic programming)是通过组合子问题而解决整个问题的解. 分治法是将问题划分成一些独立的子问题,递归地求解 ...
- 多线程动态规划算法求解TSP(Traveling Salesman Problem) 并附C语言实现例程
TSP问题描述: 旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须 ...
随机推荐
- Overcome the Dilemma of "unlock" and "trust"
When examining an Android phone, we have to overcome some barriers first so that we could extract da ...
- iOS中僵尸对象的实现方法
什么是僵尸对象?所谓僵尸,就是过度释放的对象.在ios开发中,僵尸对象对于开发人员调试程序来说很有用.我们通常将NSZombieEnabled环境变量设置为YES来打开僵尸对象,但这会导致所有的对象都 ...
- Linux使用Shell脚本实现ftp的自动上传下载
1. ftp自动登录批量下载文件. #####从ftp服务器上的/home/data 到 本地的/home/databackup#####!/bin/bashftp -n<<!open 1 ...
- SQLite开发工具
Sqlite 管理工具 SQLiteDeveloper及破解 功能特点 表结构设计,数据维护,ddl生成,加密数据库支持,sqlite2,3支持 唯一缺憾,收费,有试用期 下载地址: http://w ...
- silverlight获取web的url参数
1.网址(如:http://localhost:8081/index.aspx?name=123) 2.获取name=123的信息 3.IDictionary<string,string> ...
- JMeter2.13进行压力测试
1.安装 2. 样本数目 总共发送到服务器的请求数. 最新样本 代表时间的数字,是服务器响应最后一个请求的时间 吞吐量 是服务器每分钟处理的请求数. 平均值 是总运行时间除以发送到服务器的请求数. 中 ...
- div+css+jQuery图片横向滚动代码(带左右点击按钮)
首先感谢Blue老师的javascript教程,给了我很多的启发,这是我在看完10 - 定时器的使用 - 2这节视频后,自己试着用jQuery重新改写了一下代码,感觉至少比百度搜出来的那一坨靠谱多了, ...
- 初识 css3中counter属性
最近看到counter属性,好奇是做什么用的,于是去查了查. 1.简单介绍 counter是为css中插入计数器.[注明]在CSS2.1中counter()只能被使用在content属性上.关于浏览器 ...
- 第一节 MongoDB介绍及下载与安装
引言 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类 ...
- B-树
定义: B-树是一种平衡的多路查找树,在文件系统中有所应用.主要用作文件的索引. 特性:(M为层数) 1.定义任意非叶子结点最多只有M个儿子:且M>2: 2.根结点的儿子数为[2, M]: 3. ...