C语言中的0-1背包问题
描述:
需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。
输入:
多个测例,每个测例的输入占三行。第一行两个整数:n(n<=10)和c,第二行n个整数分别是w1到wn,第三行n个整数分别是p1到pn。
n 和 c 都等于零标志输入结束。
输出:
每个测例的输出占一行,输出一个整数,即最佳装载的总价值。
输入样例:
1 2
1
1
2 3
2 2
3 4
0 0
输出样例:
1
4
#include<stdio.h>
int output[100]={0};
int cnt=0;//结果和结果个数设为全局变量,为beibao和main函数间需要传输的数据。
int beibao(int n,int c,int w[20],int v[20])
{int dp[100][100]={0};int i,k; //建立二维数组,i表示前i件物品,k表示总重量不超过k。//数组内元素全部初始化为0for(i=1;i<=n;i++)//二重循环讨论i,k取不同值所有可能的情况{for(k=1;k<=c;k++){if(w[i]<=k){if(v[i]+dp[i-1][k-w[i]]>dp[i-1][k]) dp[i][k]=v[i]+dp[i-1][k-w[i]];else dp[i][k]=dp[i-1][k];//加入与不加入第i件物品,哪个使价值更大。}else dp[i][k]=dp[i-1][k];}}output[++cnt]=dp[n][c];//最优解为有n件物品,总重量不超过c时。//将结果存放在output数组中最后统一输出。
}
int main()
{int n,c,z[20],p[20];while(1){scanf("%d%d",&n,&c);if(n==0&&c==0) break;//输入结束,退出循环for(int i=1;i<=n;i++){scanf("%d",&z[i]);}for(int i=1;i<=n;i++){scanf("%d",&p[i]);}beibao(n,c,z,p);//每输入完一组数据,进行一次计算,求出这组数据的最优解。}for(int i=1;i<=cnt;i++){printf("%d\n",output[i]);//输出output中元素,即为每一次计算的结果。}
}
这道题的想法与取棋子问题相似。都是找出一种递推关系,并从最基本的情况开始逆推,用多重循环讨论所有可能,最后得出答案。
就如取棋子问题设二维数组讨论堆中所剩棋子和每次可取棋子数一样,这里设二维数组讨论前i件商品和容量上限k。
用i++和k++一个一个遍历,虽然其中很多k容量不能充分利用,很多i,k不同取值时结果并没有变化,但这样讨论不会遗漏任何情况,可以省略很多思考。
C语言中的0-1背包问题相关推荐
- 快速搞懂C语言中exit(0)与exit(1)有什么区别??
C语言中exit(0)与exit(1)有什么区别?? exit(1)表示异常退出,在退出前可以给出一些提示信息,或在调试程序中察看出错原因. exit(0)表示正常退出. return是语言级别的,是 ...
- c语言中的0、‘0’、‘\0’、“0”及NULL
c语言中的0.'0'.'\0'."0"及NULL ASCII表字符的表示方法: ①单引号表示法:例如 'A' ②十进制表示法:直接使用该字符在ASCII表中的序号(即十进制值),例 ...
- C语言中的‘\0’是什么?
'\0'是什么? '\0' 是转义字符 ,为了告诉编译器'\0'是空字符,而不是字符0. 字符'0'对应的二进制为00110000,而'\0'对应的二进制为00000000 在c语言中通常用一个字符数 ...
- c语言中return 0的作用,return 0在c语言中代表着什么?
return 0在c语言中代表着什么? 发布时间:2020-03-26 17:05:39 来源:亿速云 阅读:601 作者:小新 return 0在c语言中代表着什么?可能大家对c语言并不陌生,或者从 ...
- c语言中exit(0)的作用,C语言中exit(0)与exit(1)有什么区别??
C语言中exit(0)与exit(1)有什么区别?? 來源:互聯網 2011-05-19 04:55:14 評論 分類: 電腦/網絡 >> 軟件 問題描述: return又和exit( ...
- C语言中的‘\0’、0、‘0’和NULL辨析
C语言学习笔记(1) 文章目录 C语言学习笔记(1) 前言 一.\0是什么? 二.与NULL.'0'.0的区别 1.与NULL的区别 2.与'0'和0的区别 总结 前言 本文记录在学习过程中,遇到的关 ...
- C语言中exit(0)与exit(1)的区别
C语言中_exit(),exit(0)与exit(1)有什么区别 今天天气有点冷,当我在写消息队列的程序的时候,遇到了结束进程的这个问题,突然脑海里有点混乱,我是用_exit(),还是用exit(1) ...
- C语言中exit(0) 、exit(1) 和return的区别
C语言中的exit 文字描述 代码验证 return 表示返回 , 函数返回 exit 表示程序退出 exit(0) 表示正常退出,代码为1 exit(1) 表示异常退出,代码为1 文字描述 retu ...
- 23.C语言中#if 0,#if 1,#else,#endif的作用
在调试中经常遇到,写好的程序,需要调试多种情况,但是,我们同一时间只是想看到一种情况,如: 有两款单片机的程序,分别对应着不同的硬件引脚,我们把代码都写上了,但是不想让他们同时起效,通 ...
- c语言中time 0 返回值,clock()返回值为什么是0
clock()返回值为什么是零? 我在一个算法题目的时候,用到clock()函数,然后发现这个函数老师怪异的,然后自己写一个程序来测试,咋会这样呢? #include #include int mai ...
最新文章
- Python的控制语句1
- Redis-3.2.6 配置文件中文翻译
- win7 64位数据库连接问题:在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配
- Visual Studio LightSwitch初体验和定位看法
- div里嵌套了img底部会有白块问题和图片一像素问题解决
- 英特尔全部cpu列表_Debian发布安全更新 以修复近期披露的英特尔MDS安全漏洞
- SpringBoot连接Redis服务出现Command timed out
- linux创建环境变量有什么用,环境变量和shell变量到底有什么区别呢?
- 13.熟悉JDK的配置,环境变量
- (译)Cocos2d_for_iPhone_1_Game_Development_Cookbook:1.5播放视频文件
- 盲盒小程序源码下载、附赠完整图片素材源码
- 基于html + css + js完成淘宝网首页效果
- ASP程序性能测试报告
- android 指纹识别 怎么使用方法,android实现指纹识别
- 特征频率、最y大振荡频率、截止频率有什么关系和异同
- php投影,使用 CSS 3 制作长投影
- Acer S3 拆机换固态硬盘!【我的Acer S3小三,时尚时尚最时尚!】
- <JVM下篇:性能监控与调优篇>03-JVM监控及诊断工具-GUI篇
- Compilation failed while executing : strip 问题解决
- 进制数与字符串之间的转换