列出所有0~4的排列組合
#include <stdio.h>
#include <stdlib.h>
int* A;
int sol[5];
void backtrack(int n){
if(n==5){
for(int i=0;i<n;i++)printf("%d ",sol[i]);
printf("\n");
return ;
}
for(int i=0;i<5;i++){
int ok=1;
for(int j=0;j<n;j++){
if(sol[j]==i)ok=0;
}
if(ok){
sol[n]=i;
backtrack(n+1);
}
}
}
int main(){
backtrack(0);
return 0;
}
2015年7月17日星期五
2015年7月2日星期四
DP
Thanks my buddy tought me in a easily-understand way.
1. 遞迴
2. 筆記本
3. 下到上
f(1) = 1
f(2) = 1
f(3) = 2 = f(2) + f(1)
f(4) = f(3) + f(2)
f(5) = f(4) + f(3) = f(3) + f(2) + f(3) = f(2) + f(1) + f(2) + f(2) + f(1)
...
f(n) = f(n-1) + f(n-2)
// return f(n)
// DP
// n <= 1000
int arr[1001];
Zero(arr);
arr[1] = 1; // f(1) = 1
arr[2] = 1; // f(2) = 1
int f(int n) {
if(arr[n] != 0) return arr[n];
else return arr[n]=(f(n-1) + f(n-2));
}
f(4) + f(3)
f(3) + f(2) + f(3)
f(2) + f(1) + f(2) + f(3)
2 + f(2) + f(3) // arr[3] = 2
int f(int n) {
if(n == 1 || n == 2) return 1;
// n >= 3
int n_1 = 1 /* f(2) = 1 */,
n_2 = 1 /* f(1) = 1 */,
n;
for(int i = 3; i <= n; ++i) {
n = n_1 + n_2;
n_2 = n_1;
n_1 = n;
}
return n;
}
1. 遞迴
2. 筆記本
3. 下到上
f(1) = 1
f(2) = 1
f(3) = 2 = f(2) + f(1)
f(4) = f(3) + f(2)
f(5) = f(4) + f(3) = f(3) + f(2) + f(3) = f(2) + f(1) + f(2) + f(2) + f(1)
...
f(n) = f(n-1) + f(n-2)
// return f(n)
// DP
// n <= 1000
int arr[1001];
Zero(arr);
arr[1] = 1; // f(1) = 1
arr[2] = 1; // f(2) = 1
int f(int n) {
if(arr[n] != 0) return arr[n];
else return arr[n]=(f(n-1) + f(n-2));
}
f(4) + f(3)
f(3) + f(2) + f(3)
f(2) + f(1) + f(2) + f(3)
2 + f(2) + f(3) // arr[3] = 2
int f(int n) {
if(n == 1 || n == 2) return 1;
// n >= 3
int n_1 = 1 /* f(2) = 1 */,
n_2 = 1 /* f(1) = 1 */,
n;
for(int i = 3; i <= n; ++i) {
n = n_1 + n_2;
n_2 = n_1;
n_1 = n;
}
return n;
}
訂閱:
文章 (Atom)
-
因為先前寫UVa時,檔案名稱有時會花心思改,有時就直接把題目名稱加上.cpp就貼上了 導致現在有不同的格式出現 現在要處理的事情很簡單 1. 去除空白 2. 將底線 ( _ ) 換成dash ( - ) 經過一番查詢,終於發現最簡單的方法 - re...
-
文章出處: http://infbugs.blogspot.tw/2011/12/c_20.html 謝謝沙耶,解答了我長久以來對於 input/output 的疑惑。 C 語言入門 - 在線上批改系統練功 如何練習使用基本語法 自己出個練習題試著寫...
-
一開始用數學方法推斷得出,設輸入為n k為在n的前一斜線列數,故只要找到 (1+k)*k/2 < n 的最大k值,即可判定 k%2 == 1 => ((2*n)-(k*k)-k)/2 / ((k*k)+(3*k)-(2*n)+4)/2 k%2 ==...