子集和問題 暴力求解演算法
阿新 • • 發佈:2019-01-06
子集和問題的一個例項為<S,c>。其中S={x1,x2,…,xn}是一個正整數的集合,c是一個正整數。子集和問題判定是否存在S的一個子集S1,使得S1中所有元素的和為c。
暴力法也稱為窮舉法、蠻力法,它要求調設計者找出所有可能的方法,然後選擇其中的一種方法,若該方法不可行則試探下一種可能的方法。
暴力法也是一種直接解決問題的方法,常常直接基於問題的描述和所涉及的概念定義。 暴力法不是一個最好的演算法,但當我們想不出更好的辦法時,它也是一種有效的解決問題的方法。
暴力法的優點是邏輯清晰,編寫程式簡潔。在程式設計競賽時,時間緊張,相對於高效的、巧妙的演算法,暴力法編寫的程式簡單,能更快地解決問題。同時蠻力法也是很多演算法的基礎,可以在蠻力法的基礎上加以優化,得到更高效的演算法。
而且,某些情況下,演算法規模不大,使用優化的演算法沒有必要,而且某些優化演算法本身較複雜,在規模不在時可能因為複雜的演算法浪費時間,反而不如簡單的暴力搜尋。
使用暴力法常用如下幾種情況:
(1)搜尋所有的解空間;
(2)搜尋所有的路徑;
(3)直接計算;
(4)模擬和模擬
#include <stdio.h> #include <math.h> int main() { int i,j; int n,c; int *s; int temp,sum; scanf("%d%d",&n,&c); s=new int [n]; for(i=0;i<n;i++){ scanf("%d",&s[i]); } for(i=0;i<pow(2,n);i++) { temp=i; sum=0; for(j=0;j<n;j++) { if(temp%2) sum+=s[j]; temp=temp/2; } if(sum==c) { temp=i; for(j=0;j<n;j++) { if(temp%2) { printf("%4d",s[j]); } temp=temp/2; } printf("\n"); } } return 0; }