题目描述:

有若干个物品要装进背包,并且每个物品有各自的价值,物品的数量、价值以及背包的容量由用户输入,求背包内能够存入的最大价值为多少,并且求出此时放入了哪些物品

输入格式:

第一行输入物品的容量r和物品个数n

第二行输入每个物品的重量

第三行输入每个物品的价值

输出格式:

第一行输出背包中能够存储的最大价值

第二行输出此时背包中的物品编号

思路分析: 

可以把这个问题看成是一个二维数组,行是物品编号,列是背包容量,若物品编号为2,背包容量为4,代表的则是当背包容量为4的时候,前两个物品的最大价值。因此当行为物品数,列为背包容量时,即容量为n的背包能够存储的最大价值。

因此我们定义一个函数给全局变量二维数组赋值,返回二维数组右下角的值即可。

那么怎么判断放入了哪些物品呢,此时可以根据算法来逆推,若当前物品在当前容量时的价值,与前一个物品在相同容量时的价值相等,则证明当前物品没有被放进背包。若不相等,则证明当前物品放进了背包,此时物品数-1,容量数减去当前物品的重量。

因此,我们再定义一个函数来寻找背包内放入了哪些物品,并且还要定义一个全局数组,数组的长度就是物品数,数组里面默认都是0,如果在函数中判断放入了该物品,则物品编号对应的值赋1,最后在主函数中判断即可。,

样例输入:

10 3
3 4 5
4 5 6

样例输出:

11
2 3

代码实现: 

#include<stdio.h>
int f[100][100];//构建最优矩阵,定义全局变量,默认赋0
int find[100];//定义一个数组,寻找背包内放入了哪些物品int best(int r,int n,int *weight,int *value)//定义一个构建最优矩阵的函数
{     int i,j;for(i=0;i<=n;i++)f[i][0]=0;for(i=0;i<=r;i++)f[0][i]=0;for(i=1;i<=n;i++)for(j=1;j<=r;j++){   if(weight[i]<=j&&f[i-1][j-weight[i]]+value[i]>f[i-1][j])f[i][j]=f[i-1][j-weight[i]]+value[i];elsef[i][j]=f[i-1][j];}return f[n][r];}void object(int r,int n,int *weight)//定义一个函数寻找背包里面放入了哪些物品,因为改变的是全局变量find数组的值,所以函数可以不必有返回值
{        int i,j=r;for(i=n;i>=1;i--){   if(f[i][j]!=f[i-1][j])  //如果当前价值,比不放当前物品的价值不一样,则代表放入了当前物品{find[i]=1;j=j-weight[i];}}
}int main()
{  int weight[100]={0};int value[100]={0};int r,n,i,maxvalue;//r为背包容量 n为物品数量 maxvalue为最大的背包价值scanf("%d%d",&r,&n);for(i=1;i<=n;i++)scanf("%d",&weight[i]);//输入物品的重量for(i=1;i<=n;i++)scanf("%d",&value[i]);//输入物品的价值maxvalue=best(r,n,weight,value);object(r,n,weight);printf("背包的最大价值为:%d\n",maxvalue);printf("背包里面存入了物品:");for(i=1;i<=n;i++)if(find[i]==1)printf("%d ",i);return 0;}

c语言背包问题(动态规划解法)相关推荐

  1. 背包问题动态规划解法

    一:题目: 背包问题 问题:两个数组 一个重量数组W 一个 价值数组 V 一个背包 bag  ,返回不超过背包容量返回最大价值 二:暴力解法 思路:暴力遍历,思路就是递归的时候 按 选或者不选 当前 ...

  2. 算法设计与分析 0-1背包问题 动态规划解法【超详细】

    0-1背包问题 问题描述 给定i个物品和一个容量为的背包,物品的重量是Wi,其价值为Vi 物品个数为i,背包容量为C. 如何选择装入背包内的物品,使得装入背包中的物品的总价值最大? 其中,每种物品只有 ...

  3. 0-1背包问题动态规划模型的Python解法

    0-1背包问题动态规划模型的Python解法 1.01背包问题 2.Python解决方案 3.01背包问题例题 1.01背包问题 背包问题(Knapsack problem)是一种组合优化的NP完全问 ...

  4. 0/1背包问题——动态规划、回溯、分支限界法对比

    0/1背包问题--动态规划.回溯.分支限界法对比 2017.12.19 20:42:02 字数 3713 阅读 2820 目录 1.问题描述 1.1 问题描述 1.2 问题的数学表示(规划类问题,此种 ...

  5. 背包问题动态规划matlab,01背包问题动态规划详解

    计算机算法分析考试:动态规划0-1背包问题,怎么算她说她没醉,却一直摇摇晃晃掉眼泪:你说你爱她,却从未想过给她一个家. 要考试了,老师给划重点有一题:动态规划0-1背包问题,怎么算. 怎么理问题描述: ...

  6. 5. 最长回文子串——暴力法---动态规划解法---扩展中心法

    暴力法 动态规划解法 class Solution {public String longestPalindrome(String s) {if (s == null) return null;cha ...

  7. C语言背包问题的算法(附完整源码)

    C语言背包问题的算法 背包问题引出 C语言背包问题的算法完整源码(定义,实现,main函数测试) 背包问题引出 想象你是一个小偷,你想从房间里偷东西. 您有一个可以处理最大重量W的背包,并且您想把它装 ...

  8. leetcode 64. 最小路径和(递归 / 动态规划解法图解)(Java版)

    题目 leetcode 64. 最小路径和 提示: m == grid.length n == grid[i].length 1 <= m, n <= 200 0 <= grid[i ...

  9. leetcode 53. 最大子序和 动态规划解法、贪心法以及二分法

    题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子 ...

  10. matlab多种分配方案_基于MATLAB的水资源优化分配问题动态规划解法

    基于 MATLAB 的水资源优化分配问题动态规划解法 摘要:介绍了动态规划的基本原理,针对水资源分配问题进行了 动态规划方法分析.针对具体问题采用逆序解法的表格法进行了计 算,然后用 matlab 编 ...

最新文章

  1. 我在美团的这两年,想和你分享
  2. python实现单链表与双向链表
  3. 8.2.1.3 Range Optimization
  4. datatables 展开 折叠_【图说新机】9月折叠屏、屏下摄像头新机同时上市,该怎么选?...
  5. data layui table 排序_浅谈layui中table的sort排序
  6. [vue] 使用vue写一个tab切换
  7. 动态规划——买卖股票的最优时机含手续费(Leetcode 714)
  8. 【英语学习】【WOTD】impetus 释义/词源/示例
  9. STL之set_union、set_intersection、set_difference、set_symmetric_difference
  10. Js逆向教程-05明确js逆向的目标
  11. Linux编程,vim/vi环境
  12. java编译器eclipse_Java 调用 Eclipse的编译器 JDT
  13. 分布电容和杂散电容_寄生电容 分布电容
  14. CE自动汇编之AOB注入
  15. tensorflow 一些概念
  16. Ubuntu(护眼设置)安装屏幕色温调节软件F.lux
  17. PTA --- 1032.挖掘机技术哪家强 (20 分)
  18. L2TP客户端之Strongswan移植(三)
  19. 好玩的黑科技app:推荐5款功能逆天的黑科技应用!
  20. 李国庆在直播间说了多少大实话

热门文章

  1. 水仙花数,用scratch编程实现
  2. Day768.大佬推荐的经典的Redis学习资料 -Redis 核心技术与实战
  3. 硬盘总是在计算机中消失了,我计算机的D盘,E盘和F盘都消失了,只有C盘了. 这是怎么回事? -d驱动器c驱动器...
  4. onenote使用python开发_如何充分利用 OneNote,发挥它的全部价值和潜力?
  5. linux非root用户添加rzsz,linux RZSZ RZSZ 安装
  6. VS2019添加自定义发布本地的Nuget(.nupkg文件)
  7. 开源项目管理软件产品对比分析资料整理
  8. DoIP诊断技术一点通
  9. 电影:美国队长:复仇者先锋
  10. 做了三年Java,java参考文献近五年图书