回溯法求不等式的所有整数解

2024-01-01 08:52

本文主要是介绍回溯法求不等式的所有整数解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这份代码本来是用来解决这个问题的

但是,修改之后即可用来解决任意多个xi组成的满足不等式的整数解

这里用真代码而不是伪代码来表示

源代码:

#include<iostream>
using namespace std;
const int N=1010;
int p,q,r,goal,n;
int cnt,sum,MIN;
int A[N],t[N],s[5];
int Min(int a,int b,int c)
{int t=a<=b?a:b;return t<=c?t:c;
}
void solve(int k)
{	//i代表x取值 for(int i=0;i<=goal/MIN;i++)//注意i从0开始 {t[cnt++]=i;//		int total=0;
//		for(int j=0;j<cnt;j++) total+=t[j];sum+=s[k]*i;
//		printf("solve(%d),i=%d,sum=%d\n",k,i,sum);
//		printf("几个系数为:");
//		for(int j=0;j<3;j++) printf("%d ",t[j]);
//		printf("\n");if(k!=n)solve(k+1);if(sum<=goal){	
//			printf("----sum<=goal,solve(%d),i=%d,sum=%d,cnt=%d\n",k,i,sum,cnt);for(int j=0;j<3;j++) printf("%d ",t[j]);printf("\n");}
//		printf("solve(%d),i=%d,sum=%d,cnt=%d,执行完毕!\n",k,i,sum,cnt);cnt--;t[cnt]=0;sum-=s[k]*i;//如果i从1开始会导致缺解,只能获得以x1开头的各个解,//而不能获得以x2,x3开头的各个解如(0,3,0),(0,0,5) }
}
int main()
{n=3;cin>>p>>q>>r>>goal;s[1]=p,s[2]=q,s[3]=r;MIN=Min(p,q,r);for(int i=1;i<=goal;i++) A[i]=i;solve(1);return 0;	
} 

运行结果:

可以看到,这些解都是正确的。

现在做简单修改,把输入n和p,q,r的部分修改一下,即可用来解决任意多个自变量xi的不等式

(根据自变量个数修改N的值,如果自变量个数大于原来的N值1010)

注意修改之后s数组下标从1开始,因为这个下标和solve的递归层数(从第一层开始)相关联

	//n=3;//cin>>p>>q>>r>>goal;//s[1]=p,s[2]=q,s[3]=r;cin>>n>>goal;//注意这里下标从1开始,因为这个下标和solve的递归层数(从第一层开始)相关联for(int i=1;i<=n;i++) cin>>s[i];

最后,再把MIN函数修改一下即可

这篇关于回溯法求不等式的所有整数解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/558751

相关文章

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

回溯——9.全排列

力扣题目链接 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解题思路 问题建模:题目要求给出一个数组的所有排列组合,属于典型的全排列问题,这可以用回溯法来解决。回溯法通过递归的方式,依次将数组中的每个元素放入排列中,直到生成

Collection的所有的方法演示

import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;public class TestCollection {/*** @param args* Collection的所有的方法演示* 此程序没有使用泛型,所以可以添加任意类型* 以后如果写到泛型会补充这一方面的内容*/public s

Temu官方宣导务必将所有的点位材料进行检测-RSL资质检测

关于饰品类产品合规问题宣导: 产品法规RSL要求 RSL测试是根据REACH法规及附录17的要求进行测试。REACH法规是欧洲一项重要的法规,其中包含许多对化学物质进行限制的规定和高度关注物质。 为了确保珠宝首饰的安全性,欧盟REACH法规规定,珠宝首饰上架各大电商平台前必须进行RSLReport(欧盟禁限用化学物质检测报告)资质认证,以确保产品不含对人体有害的化学物质。 RSL-铅,

单精度浮点数按存储格式转为整数的程序

///#include<cstdio>//-----------------union int_char{unsigned char ch[4];float i;};void out_put(union int_char x)//x86是小端对其模式,即最数据的最低位存储在地址的最低位上。{printf("单精度浮点数值为:%f\n",x.i,x.i);printf("存储位置从左到右