第七章主要講述暴力求解法
許多問題都可以暴力解決--不用動太多腦筋,把所有可能性都列舉出來,然後一一試驗,儘管這樣的方法看起來顯得很「笨」,但卻常常是行之有效的
在列舉複雜物件之前,先嘗試著列舉一些相對簡單的內容,如整數,子串等,儘管暴力列舉不用太動腦筋,但對問題進行一定的分析往往會讓演算法更加簡潔,高效(常見剪枝)
division
暴力列舉即可(doge
#includeusing namespace std;
const int base = 100000;
int main() ;
int n1 = i, n2 = n*i;
while(n1)
num[n1%10] = 1;
n1 = n1/10;
}if(flag) continue;
while(n2)
num[n2%10] = 1;
n2 = n2/10;
}for(int j = 1; j < 10; j++)
}if(flag) continue;
sign = 0;
printf("%05d / %05d = %d\n", n*i, i, n);
} if(sign) cout << "there are no solutions for " << n << "." << endl;
} return 0;
}
列舉0-9所有排列,沒這個必要,只需要列舉fghij就可以算出abcde,然後判斷是否所有數字都不相同即可,不僅程式簡單,而且列舉量也從10!=3628800降低至不到1萬,而且當abcde和fghij加起來超過10位時可以終止列舉,這邊的應該是指有人到達六位數就不可以了?,感覺有點矛盾。由此可見,即使採用暴力列舉,也是需要認真分析問題的
maximum_product
#includeusing namespace std;
const int maxn = 20;
int val[maxn];
long long value(int s, int e)
return temp;
}long long getval(int m, int n)
if(cnt%2)
}else
return ans;
}int main()
} temp = getval(s, n);
if(temp > ans) ans = temp;
cout << ((ans <= 0) ? 0 : ans) << "." << endl << endl;
} return 0;
}
好吧,筆者前面**嚴重,不敢寫的過於奔放,本題可以直接硬列舉,時間上是寬裕的,可以不用進行優化
連續子串行有兩個要素:起點和終點,因此只需列舉起點和終點即可。由於每個元素的絕對值不超過10且不超過18個元素,最大可能的乘積不會超過10**18,可以用long long儲存。
7 1 簡單列舉 7 1 1除法
輸入正整數n,按從小到大的順序輸出所有形如abcde fghij n的表示式,其中a j恰好為數字0 9的乙個排列,2 n 79。樣例輸入 62 樣例輸出 79546 01283 62 94736 01528 62 思路 列舉fghij 求出abcde,列舉量從10!3628800不到10000.實...
PTA 7 1 換硬幣 列舉
7 1 換硬幣 20 分 將一筆零錢換成5分 2分和1分的硬幣,要求每種硬幣至少有一枚,有幾種不同的換法?輸入在一行中給出待換的零錢數額x 8,100 要求按5分 2分和1分硬幣的數量依次從大到小的順序,輸出各種換法。每行輸出一種換法,格式為 fen5 5分硬幣數量,fen2 2分硬幣數量,fen1...
簡單的列舉
補一下從前的做題記錄。某天一口氣水了三道簡單的列舉 這三道題的核心思想就是列舉,通過暴力的列舉所有情況來結局題目。總體來說比較不費腦,只需要列舉所有情況就可以了,但是在列舉的 方法上,要注意方法的優化,不然可能會超時的。第一題 uva725 7.1 division 這個題的意思是說輸入正整數n,按...