分成互質組
檢視 提交 統計 提問
總時間限制: 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 ...