关闭

c语言算法—背包问题进阶型(含有两个约束项)

在之前的01背包问题中,我们可以发现约束项都只有一个,下面我们来探讨两个约束项的情况;首先,我们考虑使用一维还是二维来表达:在有一个约束项时,我们需要二维,因为横向表示物品数,而竖向表示约束项的改变;所以我们发现,当有两个约束项的时候,不能再使用二维数组的方式了;所以,我们决定使用一维数组;再考虑,一维数组时,用数组的下标来表示约束项的改变,那么当有两个约束项的时候,明显下标不够,那么什么能用来表示...
阅读(214) 评论(0)

c语言算法—01背包问题(一维表达形)

经过上次我们用基础的算法解决了背包问题之后,现在我们来看另外一种算法:通过一维数组表达;其实,在上次我们使用二维数组时可以发现,我们在从上往下建立(横向建立)的时候,数据是一行一行成型的,而新的数据是在原先一排旧的基础上更新形成的,所以,我们来想,我们其实并不需要储存旧的数据,而可以直接在同一个位置上进行数据的更新,永远只保存新的位置上的数据;如果这样的话,我们就只需要一个m+1长的一维数组了。#i...
阅读(200) 评论(0)

c语言算法—01背包问题(基础型)

01背包问题在动态规划中很是常见,那就只简略概述一下背包问题:有一个背包,承重不能超过m千克,现有n件物品,都有其对应的质量与价值;要求在不超过最大承重的情况下,输出最大价值;解决这个问题的最基础方式是使用二维数组;行数为其物品的个数(0行空出),列数为0-m;每一次我们在进行填表时,每一个数都应该有两次填写机会,第一次令其等于其上一行同一列的数,而第一次进行更新,即计算此时的重量减去i的重量再加上...
阅读(688) 评论(0)

C语言算法—比赛试题(x星球的人员安排)【有错误代码,望大神们指点】(类似建立树的回溯法)

在3个帖子写完了以建立树的方式形成的算法之后,无意间看到了蓝桥杯的一道试题,也是联想到了这道题同样可以使用刚才的算法来建立,不过,比起那几个题目,这个试题增加了约束要求条件;先上题: X星球要派出一个5人组成的观察团前往W星。 其中: A国最多可以派出4人。 B国最多可以派出2人。 C国最多可以派出2人。 D国最多可以派出1人。 E国最多可以派出1人。 F国最多可以派出3人。 问最...
阅读(413) 评论(0)

C语言算法—(生成数字的组合升级)生成数据的全排列(类似建立树的回溯法)

其实我们可以看到,在上一个算法(生成数字的组合)中,生成的数据中包含了已知数据的全排列在其中了; 所以我们可以对上一个程序生成的数据进行一次筛选就可以得到全排列;首先,给出上一个算法(生成数字的组合)的链接: 生成数字组合在上图中,我们可以看到属于全排列的组合和普通组合的差别在于全排列组合中的数据没有重复项,这样,就非常简单了;我们只需要将top组合进行一次筛选,筛选出在top数组中没有重复项的...
阅读(338) 评论(0)

C语言算法—(生成子集的升级)生成数据的全部组合(含重复数字)(类似建立树的回溯法)

继上篇文章(生成子集)之后,我们来看类似于此种算法的另一种功能算法:生成固定数据的全部组合; 先上算法:#include #include int n; int sum; void build(int *a,int *top,int m) { if(m==n) { printf("{"); for(int i=0...
阅读(333) 评论(0)

C语言算法—生成数集的所有子集(类似建立树的回溯法)

#include #include int N; void build(int *a,int *tag,int n) { if(n==N) { printf("{"); for(int i=0;i<N;++i) if(tag[i]==1) printf("%d",a[i]);...
阅读(445) 评论(0)
    个人资料
    • 访问:2686次
    • 积分:96
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档