1. 程式人生 > >子集和問題 暴力求解演算法

子集和問題 暴力求解演算法

子集和問題的一個例項為<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;
}