顺序表-找出最小正整数

找出最小正整数

题

  • 算法思想
    设计一个指标k=1表示当前趟数未出现的最小正整数,若数组中出现与k值相等的元素则k值加1,最后遍历完成得到的k即为数组中未出现的最小正整数
#include<stdio.h>
#define M 5
int main(){
	//找出未出现的最小正整数
	int a[M];
	printf("请输入数:\n");
	for(int i=0;i<M;i++){
		scanf("%d",&a[i]);
	}
	int k=1;
	for(int i=0;i<M;i++){
		if(a[i]==k) k++;//出现相同的元素k增1
	}
	printf("数组中未出现的最小正整数是%d",k);
}
  • 运行结果
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
下面是使用FIFO分支限界方法求解子集和数问题的C++代码实现: ```c++ #include <iostream> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int N = 205; int n, m; int w[N]; bool st[N][N]; struct Node { int sum; int k; int path[N]; bool operator < (const Node& t) const { return sum < t.sum; } }; void bfs() { priority_queue<Node> q; Node root = {0, 0}; q.push(root); while (q.size()) { Node t = q.top(); q.pop(); if (t.sum == m) { for (int i = 1; i <= t.k; i ++ ) cout << t.path[i] << " "; cout << endl; continue; } if (t.k == n) continue; if (t.sum + w[t.k + 1] <= m && !st[t.k + 1][t.sum + w[t.k + 1]]) { Node a = t; a.sum += w[a.k + 1]; a.k ++ ; a.path[a.k] = a.k; q.push(a); st[a.k][a.sum] = true; } if (!st[t.k + 1][t.sum]) { Node b = t; b.k ++ ; q.push(b); st[b.k][b.sum] = true; } } } int main() { cin >> n >> m; for (int i = 1; i <= n; i ++ ) cin >> w[i]; memset(st, false, sizeof st); bfs(); if (!st[n][m]) cout << "no solution!" << endl; return 0; } ``` 在上述代码中,我们使用了一个优先队列来维护当前搜索状态,每次取队列中的最小元素进行扩展。 我们使用Node结构体来示当前搜索状态,sum示当前状态对应的子集和数,k示当前状态对应的选中的元素个数,path数组示当前状态对应的选中的元素下标。 在bfs函数中,首先初始化初始状态,并将其加入优先队列中。然后,当队列不为空时,取队列中的最小元素进行扩展。如果当前状态对应的子集和数等于目标数m,则输对应的解,并继续搜索其他解;否则,分别考虑选中或不选中当前元素的两种情况,并将扩展的状态加入队列中。 需要注意的是,在扩展状态时,需要判断当前状态是否已经被扩展过,如果被扩展过,则直接跳过。 如果不到符合要求的解,则输“no solution!”。 时间复杂度:O(nmlog(nm))。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值