暴力求解 列舉法

2021-07-28 06:38:31 字數 1878 閱讀 2014

/*****0-9全排列

輸入正整數n,按從小到大的順序輸出所有形如abcde/fghij=n的表示式,其中a~j恰好為數字0~9的乙個排列,n為2到79

樣例輸入:62

樣例輸出:79546/01283=62

94736/01528=62
剛開始想用堆疊來實現0到9全排列,還有五個for迴圈也可以,

但是想到stl中有乙個next_permutation的函式,可以實現全排列,於是將其採用過來*/

寫法一:暴力剪枝

#include 

#include

#include

#include

using namespace std;

int main()

else

break;

if(!flag[s2%10])

else

break;

}int j;

for(j=0;j<10;j++)

if(!flag[j])

break;

if(j==10&&i*n

<=98765)

}return

0;}

寫法2:stl

#include 

#include

#include

#include

using namespace std;

int main()

}system("pause");

return

0;}

/*

最大乘積

輸入n個元素組成的序列s,你需要找出乙個乘積罪的的連續子串行。如果這個罪的的乘積不是正數,輸出-1.1<=n<=18,-10<=si<=10;

樣例輸入:

3 2 4 -3

5 2 5 -1 2 -1

樣例輸出:

8 20

分析:分析:連續子串行有兩個要素:起點和終點,因此只需列舉起點和終點即可。

由於每個元素的絕對值不超過10,一共又不超過18個元素,最大可能的乘積不會超過10^18,可以用long long

*/

#include 

#include

#include

#include

using

namespace

std;

int main()

s[0]=1;

maxn=-0x3f3f;

for(int i=1; i<=n; i++)

for(int i=1; i<=n; i++)

for(int j=1; j<=n; j++)

if(maxn<0)

cout

<<-1

printf("%lld\n",maxn);

return

0;}

/**分數拆分

輸入正整數k,找到所有的正整數x>=y,使得1/k=1/x + 1/y;

樣例輸入:

2 12

樣例輸出:

2 1/2 = 1/6 + 1/3

1/2 = 1/4 + 1/4

*/

#include

#include

struct integer

a[10000];

int main()

}printf("%d\n",count);

for(j=0; jprintf("1/%d = 1/%d + 1/%d\n",k,a[j].x,a[j].y);

}return

0;}

學習於:

列舉暴力求解

題目描述 有n個賭徒打算賭一局。規則是 每人下乙個賭注,賭注為非負整數,且任意兩個賭注都不相同。勝者為賭注恰好是其餘任意三個人的賭注之和的那個人。如果有多個勝者,我們取賭注最大的那個為最終勝者。例如,a,b,c,d,e分別下賭注為2 3 5 7 12,最終勝者是e,因為12 2 3 7。輸入輸入包含...

暴力求解法 簡單列舉

在剛剛開始準備學習些演算法之前,網路上很多演算法高階攻略都會建議先從一些簡單的基本演算法著手入門,其中包括 列舉,貪心,遞迴和分治,遞推,構造,模擬 這些,正好這段時間我在看的劉汝佳的 演算法競賽入門經典 這本書中涉及了很多關於基礎的東西,對於演算法的學習和acm的訓練都很有幫助,所以我打算從 藍書...

暴力求解之簡單列舉

題目 輸入正整數n,按照從小到大的順序輸出所有形如abcde fghij n 的表示式,其中a j恰好為數字0 9的乙個排列,2 n 79.樣例輸入 樣例輸出 79546 01283 62 94736 01528 62 題目分析 只需列舉fghij就可以算出abcde,然後判斷所有的數字是否有重複即...