c語言窮舉
❶ c語言窮舉法求最小公倍數
"對兩個正整數a,b,如果若干個a之和或b之和能被b所整除或能被a所整除,則該和數即為所求的最小公倍數。"這句話分開講會清楚一點:若干個a之和能被b所整除,或者,若干個b之和能被a所整除,那麼該和數即為所求的最小公倍數。但是這個說法有個錯誤,這個和可能有很多,只能叫公倍數,只有最小的才是最小公倍數。
的意思舉個例子:a=10,b=15。a*3
=
30,能被b=15整除,所以30是公倍數,60也行,但30是最小的,所以30是最小公倍數。如果從15看,兩個15,b*2
=
30,能整除10.。。。
這段程序的過程就是模擬這個演算法,先找到兩個數中較大的數p,然後判斷p是否能整除q,p*2是否能整除q,p*3是否能整除q。。。。。。直到找到能整除q的,就是最小公倍數了。為什麼是最小呢,因為p是從小到大開始找的,第一個找到的肯定是最小公倍數。
❷ c語言中,總結窮舉法適合求解的問題類型
窮舉法用於數據亂序或者沒有太好辦法時,羅列出所有可行答案來篩選。典型的適用窮舉法的編程初學問題有:百雞問題、順序查找、密碼的暴力破解等。 窮舉法的思路是,列舉出所有可能的情況,逐個判斷有哪些是符合問題所要求的條件,從而得到問題的解答。用於解決「是否存在」和「有多少可能性」等類型問題。 窮舉法一般用循環或循環嵌套結構實現,要注意循環的起點和終點,對可能的情況不能遺漏,一般也不應重復。 1、窮舉法的基本思路是把問題涉及的可能情況一一羅列出來,並且根據題目的條件和實際背景逐個作出判斷,從中挑選出符合條件的解答。 2、使用窮舉法時,要恰當地設計變數,並且決定用哪些變數作為搜索的主線,以便窮舉出所有可能情況。 3、窮舉一般使用循環結構,要注意循環的起點和終點,對可能的情況不能遺漏,一般也不應重復。 4、編製程序時,還應當根據題目要求准確地寫出是否符合條件的判斷語句。
❸ 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;
}