7 1 簡單列舉

2022-09-19 15:15:12 字數 1527 閱讀 7390

第七章主要講述暴力求解法

許多問題都可以暴力解決--不用動太多腦筋,把所有可能性都列舉出來,然後一一試驗,儘管這樣的方法看起來顯得很「笨」,但卻常常是行之有效的

在列舉複雜物件之前,先嘗試著列舉一些相對簡單的內容,如整數,子串等,儘管暴力列舉不用太動腦筋,但對問題進行一定的分析往往會讓演算法更加簡潔,高效(常見剪枝)

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,按...