當前位置:首頁 » 操作系統 » 窮舉演算法c

窮舉演算法c

發布時間: 2022-08-29 21:06:39

A. c語言能給個窮舉、迭代、遞推的舉例(要有分析)。。。

窮舉的意思能簡單, 就是'一個個猜過去'
比如要破解一個8位數的密碼, 就是從00000000到99999999的全部數字一個個試過去
這點數字對現在的計算機來說幾乎不要時間

迭代是指循環運算, 比如
for ( int i = 0; i < 99999999; ++i) 這個循環就叫做迭代

至於遞推, 以下抄自網路

遞推演算法是一種用若干步可重復的簡運算(規律)來描述復雜問題的方法. 遞推是序列計算機中的一種常用演算法。它是按照一定的規律來計算序列中的每個項,通常是通過計算機前面的一些項來得出序列中的指定象的值。其思想是把一個復雜的龐大的計算過程轉化為簡單過程的多次重復,該演算法利用了計算機速度快和不知疲倦的機器特點。

植樹節那天,有五位同學參加了植樹活動,他們完成植樹的棵樹都不相同。問第一位同學植了多少棵時,他指著旁邊的第二位同學說比他多植了兩棵;追問第二位同學,他又說比第三位同學多植了兩棵;... 如此,都說比另一位同學多植兩棵。最後問到第五位同學時,他說自己植了10棵。到底第一位同學植了多少棵樹?

分析:設第一位同學植樹的棵樹為a1,欲求a1,需從第五位同學植樹的棵數a5入手,根據「多兩棵」這個規律,按照一定順序逐步進行推算:
(1) a5=10;
(2) a4=a5+2=12;
(3) a3=a4+2=14;
(4) a2=a3+2=16;
(5) a1=a2+2=18;

遞推演算法以初始(起點)值為基礎,用相同的運算規律,逐次重復運算,直至運算結束。這種從「起點」重復相同的方法直至到達一定「邊界」,猶如單向運動,用循環可以實現。遞推的本質是按規律逐次推出(計算)先一步的結果。

B. C語言 窮舉法

#include <stdio.h>
void main()
{
int a[100]={0};
int i,j,k,m,n=0,z;
printf("輸入數字,每次回車為一個,以-1為結束數字\n");
for(i=0;i<100;i++)
{
scanf("%d",&a[i]);
n++;
if(a[i]==-1)
{
break;
}
}
for(i=0;i<n-1;i++)
{
for(j=0;j<n-2-i;j++)
{
if(a[j]>a[j+1])
{
k=a[j];
a[j]=a[j+1];
a[j+1]=k;
}
}
}
printf("排序後的數字是:\n");
for(i=0;i<n-1;i++)
printf("%d\n",a[i]);

printf("請輸入要插入的數字");
scanf("%d",&m);
for(i=0;i<n-1;i++)
{
if(a[i]<=m && a[i+1]>m)
{
z=i;
break;
}
else
{
z=-2;
}
}
if(z>=0)
{
for(i=n-1;i>z;i--)
{
a[i+1]=a[i];
}
a[z+1]=m;
}
if(z==-2)
{
a[n]=m;
}
for(i=0;i<n;i++)
{
printf("%d\n",a[i]);
}
}

C. c語言的窮舉法的背包問題

根據題目c1,c2是一組01組合的數組,也就是2個n位2進制數。
所以我的代碼邏輯就是,c1,c2初值分別是00000....以及111111....,之後循環執行c1+1;c2-1(2進制加減運算),最大執行次數2的n次方-1(n位2進制數最大數)

代碼實現功能,窮舉所有可能方案,返回:第一個/最後一個找到的可行方案。

函數intqj(BAGc1,BAGc2,intn,int*bws,intflag);
當flag=1返回第一個可行方案,flag=0查找所有方案並返回最後一個可行方案
我測試時,flag傳值0,需要自己改!!

由於迭代順序,同樣實驗數據,返回的結構和你案例結構不一樣,我在下圖標注了。

#include<stdio.h>
#include<math.h>
#include<malloc.h>
#include<string.h>
typedefstructbag
{
intbweight;
char*books;
}BAG;
intqj(BAGc1,BAGc2,intn,int*bws,intflag);//窮舉所有n位2進制組合,返回最後一個可行方案(可能有多個方案)。
//參數:c1背包1,c2背包2,n書本個數,bws所有書本重量,標識:flag=1找到第一個可行方案截止,flag=0查找所有方案
intcheckOverLoad(BAGc1,BAGc2,int*bws,intn);
voidadd2(char*nums);//2進制字元串+1運算
voidsub2(char*nums);//2進制字元串-1運算
intmain()
{
BAGc1,c2;
inti,n,*bws,sum=0;
printf("請輸入兩個背包的最大載重: ");
scanf("%d%d",&c1.bweight,&c2.bweight);
printf("請輸入書本的數量: ");
scanf("%d",&n);
c1.books=(char*)malloc(sizeof(char)*(n+1));
c2.books=(char*)malloc(sizeof(char)*(n+1));
c1.books[0]=0;
c2.books[0]=0;
bws=(int*)malloc(sizeof(int)*n);
while(1)
{
sum=0;
printf("請輸入每本書的重量: ");
for(i=0;i<n;i++)
{
scanf("%d",&bws[i]);
sum+=bws[i];
}
if(sum<=c1.bweight+c2.bweight)
break;
else
printf("書本重量和超過背包負重和!請重新輸入 ");
}


qj(c1,c2,4,bws,0);
//------------------------------列印結果-----------------------------
printf(" 輸出: ");
printf("book");
for(i=0;i<n;i++)
printf("%d",bws[i]);
printf(" ");
printf("c1%s ",c1.books);
printf("c2%s ",c2.books);
}
intqj(BAGc1,BAGc2,intn,int*bws,intflag)//窮舉所有n位二進制數,
{
inti,max=(int)pow(2,n)-1;

char*nums1,*nums2;
nums1=(char*)malloc(sizeof(char)*(n+1));
nums2=(char*)malloc(sizeof(char)*(n+1));

printf("---------開始窮舉所有可能的組合---------- ");
memset(c1.books,'0',n);
memset(c2.books,'1',n);
c1.books[n]=c2.books[n]=0;
printf("%s ",c1.books);
printf("%s ",c2.books);
if(checkOverLoad(c1,c2,bws,n)==0)
{
memset(nums1,0,n+1);
memset(nums2,0,n+1);
strcpy(nums1,c1.books);
strcpy(nums2,c2.books);
if(flag==1)
return0;
}
printf(" ");
for(i=0;i<max;i++)
{
add2(c1.books);
sub2(c2.books);
printf("%s ",c1.books);
printf("%s ",c2.books);
if(checkOverLoad(c1,c2,bws,n)==0)
{
memset(nums1,0,n+1);
memset(nums2,0,n+1);
strcpy(nums1,c1.books);
strcpy(nums2,c2.books);
if(flag==1)
return0;
}
printf(" ");
}
printf("-----------------窮舉結束------------------ ");
memset(c1.books,0,n+1);
memset(c2.books,0,n+1);
strcpy(c1.books,nums1);
strcpy(c2.books,nums2);
free(nums1);
free(nums2);
return0;
}
voidadd2(char*nums)//2進制字元串加1
{
inti,n=strlen(nums),jin=0;
for(i=n-1;i>=0;i--)
{
if(nums[i]=='0'&&i==n-1)
{
nums[i]='1';
break;
}
elseif(nums[i]-'0'+jin==1&&i<n-1)
{
nums[i]='1';
break;
}
else
{
jin=1;
nums[i]='0';
}
}
}
voidsub2(char*nums)//2進制字元串減1
{
inti,n=strlen(nums),j=0;
for(i=n-1;i>=0;i--)
{
if(nums[i]=='1'&&i==n-1)
{
nums[i]='0';
break;
}
elseif(nums[i]-'0'-j==0&&i!=n-1)
{
nums[i]='0';
break;
}
else
{
nums[i]='1';
j=1;
}
}
}
intcheckOverLoad(BAGc1,BAGc2,int*bws,intn)//檢查是否超載。超載返回1,否返回0
{
inti,sum1=0,sum2=0;
for(i=0;i<n;i++)
if(c1.books[i]=='1')
sum1=sum1+bws[i];
else
sum2=sum2+bws[i];
if(sum1>c1.bweight)
{
printf("背包1超載! ");
return1;
}
if(sum2>c2.bweight)
{
printf("背包2超載! ");
return1;
}
printf("方案可行! ");
return0;
}

D. c語言中,總結窮舉法適合求解的問題類型

窮舉法用於數據亂序或者沒有太好辦法時,羅列出所有可行答案來篩選。典型的適用窮舉法的編程初學問題有:百雞問題、順序查找、密碼的暴力破解等。 窮舉法的思路是,列舉出所有可能的情況,逐個判斷有哪些是符合問題所要求的條件,從而得到問題的解答。用於解決「是否存在」和「有多少可能性」等類型問題。 窮舉法一般用循環或循環嵌套結構實現,要注意循環的起點和終點,對可能的情況不能遺漏,一般也不應重復。 1、窮舉法的基本思路是把問題涉及的可能情況一一羅列出來,並且根據題目的條件和實際背景逐個作出判斷,從中挑選出符合條件的解答。 2、使用窮舉法時,要恰當地設計變數,並且決定用哪些變數作為搜索的主線,以便窮舉出所有可能情況。 3、窮舉一般使用循環結構,要注意循環的起點和終點,對可能的情況不能遺漏,一般也不應重復。 4、編製程序時,還應當根據題目要求准確地寫出是否符合條件的判斷語句。

E. c語言編程_窮舉法求兩個數的最大公約數

求最大公約數演算法:
(1)輾轉相除法
兩整數a和b:
① a%b得余數c
② 若c=0,則b即為兩數的最大公約數,結束
③ 若c≠0,則a=b,b=c,再回去執行①
(2)相減法
兩整數a和b:
① 若a>b,則a=a-b
② 若a<b,則b=b-a
③ 若a=b,則a(或b)即為兩數的最大公約數,結束
④ 若a≠b,則再回去執行①
(3)窮舉法:
① i= a b中的小數
② 若a,b能同時被i整除,則i即為最大公約數,結束
③ i--,再回去執行②
相關代碼:
#include <stdio.h>
int xc_gcd(int a,int b)
{
int c;
c=a%b;
while( c!=0 )
{
a=b;
b=c;
c=a%b;
}
return b;
}
int xj_gcd(int a,int b)
{
while( a!=b )
{
if ( a>b )
a-=b;
else
b-=a;
}
return b;
}
int qj_gcd(int a,int b)
{
int i;
i=(a>b)?a:b;
while( a%i!=0 && b%i!=0 )
i--;
return i;
}
void main()
{
//int a=36,b=27;
//int a=27,b=36;
int a=100,b=201;
printf("a=%d b=%d\n", a, b );
printf("輾轉相除法求最大公約數=%d\n", xc_gcd(a,b) );
printf("相減法求最大公約數=%d\n", xc_gcd(a,b) );
printf("窮舉法求最大公約數=%d\n", xc_gcd(a,b) );
}

F. c語言的窮舉法

20個5分的是1元
50個2分的是1元
100個1分的是1元
上面定義的是這三種面值的銀幣不能超過的數量~
必須小於這些數量,要不然不就超過1元了,就不符合題意了~~

G. 什麼是c語言裡面的窮舉法

假如有有一個賬號登錄需要六位數字密碼,你可以編一個程序把所有可能的數字按順序輸入直到正確的那個為止。
如果有字母就把字母的可能性也加上。
如果密碼太復雜,電腦在強大也需很長時間解決,窮舉法用於簡單的破解。

H. C語言窮舉法

為啥它們范圍會這樣取,為啥x會從1-14,這是需要仔細推算的。因為本題的計算量很小,有時就圖自己省力(少算一點)讓計算機多算一點。

因為x至少是1,而y>x,z>y,為簡單起見,而x、y、z的單價分別為a、b、c,所以,ax+by+cz=800

而ax+by+cz>ax+bx+cx

所以,800>(a+b+c)x

x<800/(30+20+10),即x<=13(取整數)

同樣的道理,y最小是2,800=30+20y+10z>30+20y+10y,y最大=770/30=25

I. c 語言中「窮舉」是啥意思

窮舉 是列出所有的可能情況,對其一一判斷

你說的是不是「枚舉」
枚舉是指規定某個變數只能取幾個固定的值

熱點內容
jquery獲取上傳文件 發布:2025-05-14 20:27:57 瀏覽:43
雲web伺服器搭建 發布:2025-05-14 20:25:36 瀏覽:525
汽修汽配源碼 發布:2025-05-14 20:08:53 瀏覽:742
蜜蜂編程官網 發布:2025-05-14 19:59:28 瀏覽:57
優酷怎麼給視頻加密 發布:2025-05-14 19:31:34 瀏覽:635
夢三國2副本腳本 發布:2025-05-14 19:29:58 瀏覽:860
phpxmlhttp 發布:2025-05-14 19:29:58 瀏覽:434
Pua腳本 發布:2025-05-14 19:24:56 瀏覽:449
蘋果像素低為什麼比安卓好 發布:2025-05-14 19:13:23 瀏覽:461
安卓機微信怎麼設置紅包提醒 發布:2025-05-14 19:00:15 瀏覽:272