分成互質組 dfs

2021-09-12 11:51:40 字數 1340 閱讀 9156

分成互質組

檢視 提交 統計 提問

總時間限制: 1000ms 記憶體限制: 65536kb

描述給定n個正整數,將它們分組,使得每組中任意兩個數互質。至少要分成多少個組?

輸入第一行是乙個正整數n。1 <= n <= 10。

第二行是n個不大於10000的正整數。

輸出乙個正整數,即最少需要的組數。

樣例輸入

614 20 33 117 143 175

樣例輸出

3解題思路:

下面摘自網上大佬的一段言論:

感覺之前寫傳統的dfs寫多了,現在都不知道變通,適當的時候應該改變一下思路。

這道題要求判斷兩兩互質,所以判斷的時間很多,好在資料範圍比較小。當要把這個數放進來之前判斷一下是否和前面的數都互質(前面的數在放進來的時候都已經判斷好了)再放,這樣會減少很多冗餘的判斷。

這樣的話,dfs再加一維,表示選到了第幾個數,現在有多少個集合。每次列舉每乙個用過的集合,如果當前有的集合都放不下,那麼就用乙個新的集合來放。

在寫**的時候 一定要注意陣列下標的問題,在dfs裡面的陣列下標 要和主函式裡面陣列下標相互對應上

#includeusing namespace std;  

int n,ans=1e9+1;

bool flag;

int a[10010],b[10010];//a儲存數

int panduan(int a,int b)

return panduan(b,a%b);

} void dfs(int x,int y)

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

} }

if(flag)

} b[x] = y+1;//集合數加1

dfs(x+1,y+1);//進行下一次查詢

b[x] = 0; //回溯

} int main()

dfs(1,1);//從第乙個(數,組)開始

cout << ans << endl;

return 0;

}

解題思路2:

#include#includeint n,a[20],b[20],c = 1;  

int fun(int x,int y)

int main()

} if(j - 1 == c) //意思就是上面的"break"一次都沒有執行

b[++c] = a[i];

} printf("%d",c);

return 0;

}

分成互質組 DFS

給定 n n 個正整數,將它們分組,使得每組中任意兩個數互質。至少要分成多少個組?輸入格式 第一行是乙個正整數 n n。第二行是 n n 個不大於10000的正整數。輸出格式 乙個正整數,即最少需要的組數。資料範圍1 n 10 1 n 1 輸入樣例 6 14 20 33 117 143 175輸出樣...

7834 分成互質組

總時間限制 1000ms 記憶體限制 65536kb 描述 給定n個正整數,將它們分組,使得每組中任意兩個數互質。至少要分成多少個組?輸入 第一行是乙個正整數n。1 n 10。第二行是n個不大於10000的正整數。輸出 乙個正整數,即最少需要的組數。樣例輸入 6 14 20 33 117 143 1...

AcWing 1118 分成互質組

我用的是狀壓dp。先預處理出可以在一組的集合。然後對每種狀態列舉它的子集進行轉移。像這樣子 for i 1 i 1 f i 表示已經把 i 集合裡的數安頓好了需要幾個組。屬性 min。時間複雜度 o n 2 times 2 n 3 n 其中 o n 2 times 2 n 是預處理的複雜度,o 3 ...