/****************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背包为题(动态规划算法)的更多相关文章

  1. 0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论

    一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i ...

  2. 【Python】0/1背包、动态规划

    0/1背包问题:在能承受一定重量的背包中,放入重量不同,价值不同的几件物品,怎样放能让背包中物品的价值最大? 比如,有三件物品重量w,价值v分别是 w=[5,3,2] v=[9,7,8] 包的容量是5 ...

  3. 动态规划算法详解 Dynamic Programming

    博客出处: https://blog.csdn.net/u013309870/article/details/75193592 前言 最近在牛客网上做了几套公司的真题,发现有关动态规划(Dynamic ...

  4. 算法(Java实现)—— 动态规划算法

    动态规划算法 应用场景-0-1背包问题 背包问题:有一个背包,容量为4磅,现有物品如下 物品 重量 价格 吉他(G) 1 1500 音响(S) 4 3000 电脑(L) 3 2000 要求: 达到目标 ...

  5. 从最长公共子序列问题理解动态规划算法(DP)

    一.动态规划(Dynamic Programming) 动态规划方法通常用于求解最优化问题.我们希望找到一个解使其取得最优值,而不是所有最优解,可能有多个解都达到最优值. 二.什么问题适合DP解法 如 ...

  6. 动态规划 算法(DP)

    多阶段决策过程(multistep decision process)是指这样一类特殊的活动过程,过程可以按时间顺序分解成若干个相互联系的阶段,在每一个阶段都需要做出决策,全部过程的决策是一个决策序列 ...

  7. CJOJ 2040 【一本通】分组背包(动态规划)

    CJOJ 2040 [一本通]分组背包(动态规划) Description 一个旅行者有一个最多能用V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2, ...

  8. CJOJ 2307 【一本通】完全背包(动态规划)

    CJOJ 2307 [一本通]完全背包(动态规划) Description 设有n种物品,每种物品有一个重量及一个价值.但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干 ...

  9. 剑指Offer——动态规划算法

    剑指Offer--动态规划算法 什么是动态规划? 和分治法一样,动态规划(dynamic programming)是通过组合子问题而解决整个问题的解. 分治法是将问题划分成一些独立的子问题,递归地求解 ...

  10. 多线程动态规划算法求解TSP(Traveling Salesman Problem) 并附C语言实现例程

    TSP问题描述: 旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须 ...

随机推荐

  1. hibernate 问题

    如果hibernate中反转的表中没有主键的话,会生产三个文件. table.java tableADO.java tableId.java 并且在执行findByProperty时,会提示:coul ...

  2. 快速搭建 Node.js 开发环境以及加速 npm

    如何快速搭建 node 开发环境 npm 超慢 github 无法打开的问题 于是我觉得应该写一篇文章解答所有这些起步问题,让新同学也能顺顺利利入门. 快速搭建 Node.js 开发环境 如果你想长期 ...

  3. word文档中的字号和磅的对应关系

    字号 磅 初号 42 小初 36 一号 26 小一 24 二号 22 小二 18 三号 16 小三 15 四号 14 小四 12 五号 10.5 小五 9 六号 7.5 小六 6.5 七号 5.5

  4. php实现文件上传的源码

    php实现文件上传的源码,更多php技术开发就去php教程网,http://php.662p.com <?php ##author :Androidyue ##sina @androidyue ...

  5. POJ C++程序设计 编程题#1 编程作业—STL1

    编程题#1 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 下面的程序输出结 ...

  6. 一个用WPF做的简单计算器源代码

    一.界面设计XAML代码 <Window x:Class="fengjisuanqi.MainWindow" xmlns="http://schemas.micro ...

  7. MVC5 Identity 自定义用户和角色

    看代码基本就都能看懂了,增加了两个用户详细信息的表,角色表增加两个字段页面中实现树形显示. //IdentityModels.cs using System.Data.Entity; using Sy ...

  8. 分析MapReduce执行过程

    分析MapReduce执行过程 MapReduce运行的时候,会通过Mapper运行的任务读取HDFS中的数据文件,然后调用自己的方法,处理数据,最后输出. Reducer任务会接收Mapper任务输 ...

  9. linux启动后自动登录并运行自定义图形界面程序

    在<Ubuntu CTRL+ALT+F1~F6 进入命令模式后不支持中文显示的解决办法>一文中提到linux启动在以后运行一个独占显示器的图形程序的两种办法. 1.不启动xserver,使 ...

  10. 《安全参考》HACKCTO-201311-11

    小编的话 “晴空一鹤排云去,便引诗情到碧宵” 11月是一个让人思绪飞扬.感慨万千的时节. 就在这时,在我们小伙伴的并肩奋战下,第十一期<安全参考>又跟大家见面了. 你还在为女朋友在购物狂欢 ...