/****************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. JavaScript 性能优化1

    一直在学习javascript,也有看过<犀利开发Jquery内核详解与实践>,对这本书的评价只有两个字犀利,可能是对javascript理解的还不够透彻异或是自己太笨,更多的是自己不擅于 ...

  2. leetcode 20

    判断括号的顺序是否正确: 思路:用一个堆栈来存储符号序列,按照符号匹配规则进行堆栈操作: 前括号一律入栈,后括号如果跟栈顶符号匹配,栈顶符号出栈如果,若不匹配则返回false: 最后栈为空返回true ...

  3. JAVA设计模式--State(状态模式)

    状态模式(State Pattern)是设计模式的一种,属于行为模式. 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要 ...

  4. thinkphp验证码点击更换js实现

    <img src="__CONTROLLER__/verify" alt="" onclick=this.src="__CONTROLLER__ ...

  5. qt5.5实现 记事本程序

    最近由于要做Qt相关的毕业设计课题,以前对Qt完全不了解,对于客户端图形界面程序,也只对Windows下的MFC熟悉, 所以,由于Qt的跨平台特性和相对比较纯的C++的特点,就准备学习一下吧.这两天逛 ...

  6. 判断字符串是否包含字母‘k’或者‘K’

    判断字符串是否包含字母‘k’或者‘K’ public bool IsIncludeK(string temp) { temp = temp.ToLower(); if (temp.Contains(' ...

  7. zend studio导入thinkphp的乱码问题

    刚刚导入thinkphp有乱码还有错误怎么办? windows -> preference -> Work space -> text file encodeing设置为 UTF-8 ...

  8. Java排序

    给出10个数,使用某种排序方法,按照从小到大的顺序输出个个数. 根据要求,首先得给出这10个数,这里的算法需要一个循环,数据结构需要一个长度为10的整型数组.首先用BufferedReader in= ...

  9. OJ推荐【转】

    来自:http://blog.csdn.net/zdp072/article/details/16207111 一. Online Judge简介: Online Judge系统(简称OJ)是一个在线 ...

  10. Laravel 5 基础(十二)- 认证

    Laravel 出厂已经带有了用户认证系统,我们来看一下 routes.php,如果删除了,添加上: Route::controllers([ 'auth' => 'Auth\AuthContr ...