C语言算法训练
问题描述
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入格式
第一行为一个整数,表示箱子容量;
第二行为一个整数,表示有n个物品;
接下来n行,每行一个整数表示这n个物品的各自体积。
输出格式
一个整数,表示箱子剩余空间。
例子
样例输入
24
6
8
3
12
7
9
7
样例输出
0
思路
可设一个元素个数为 max(v)+1的数组dp[20001],里面任意一个元素dp[i]表示箱子容积为 i 时可放入的物品的体积。因为物品的体积并不是单位体积,因此dp[i]并不一定等于 i,例如有3个物体,体积分别为3,4,5,那么容积为3和4的箱子可放入的物品的体积均为3,即dp[3] = dp[4] = 3。对于每一个物体,都有两种选择-放入或者不放入,所以外层循环可对每个物品进行遍历,而每选择一个物品,定会对大于该物品体积的dp数组元素产生影响,从而还需要一个内层数组对大于该物品体积的dp数组元素进行遍历更新。更新方法为:dp[i] = max{ dp[i] , dp[i - vi]+vi },其中vi为当前物品的体积,max中的dp[i]表示不放入该物体时的解, dp[i - vi]+vi表示放入该物体时的解(i-vi表示给即将放入的物品留出合适的体积,如之前的例子,dp[i-vi]并不一定等于dp[i] - vi),取最大值,即为最优解。需要注意的是,需要先将dp数组中的每一个元素初始化为0。
#include <stdio.h> int V;//箱子体积 int n;//个数 int a[31]; //存放物品的体积 int dp[20001]={0}; //dp[i]表示箱子容积为i时可放入的物品的体积 ,注意要初始化为0 int main () { int i,j; int t;scanf("%d",&V);scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=0;i<n;i++)//外循环,遍历每个箱子{for(j=V;j>=a[i];j--)//内循环,遍历每个容积{if(dp[j]>( dp[j-a[i]]+a[i] )) dp[j]=dp[j];elsedp[j]=dp[j-a[i]]+a[i]; //取最大值,最优解}} printf("%d",V-dp[V]); //输出最小的容积 return 0; } 123456789101112131415161718192021222324252627282930
运行示例
相关知识
c语言案例十二
求组合c(n,m)的简单算法 (新手篇04)
Python编程实现鸟类行为模拟与分类算法应用
提升树算法
C语言在线编译器助力文字转换为高效代码,快速实现编程梦想
一个宠物商店的程序c语言,C语言 宠物商店管理系统 实训报告
用c语言写一个桌面宠物
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
C语言实战案例:超市管理系统与QQ桌面宠物
贪吃蛇(C语言)2018
网址: C语言算法训练 https://www.mcbbbk.com/newsview798567.html
上一篇: iOS HTTPS请求Error |
下一篇: 买宠物网站的介绍以及买宠物狗的注 |
推荐分享

- 1我的狗老公李淑敏33——如何 5096
- 2南京宠物粮食薄荷饼宠物食品包 4363
- 3家养水獭多少钱一只正常 3825
- 4豆柴犬为什么不建议养?可爱的 3668
- 5自制狗狗辅食:棉花面纱犬的美 3615
- 6狗交配为什么会锁住?从狗狗生 3601
- 7广州哪里卖宠物猫狗的选择性多 3535
- 8湖南隆飞尔动物药业有限公司宠 3477
- 9黄金蟒的价格 3396
- 10益和 MATCHWELL 狗 3352