個人淺見,這題應該有兩種dfs,而本身想法決定速度差異。 我看到很多在1s以下的,而我的只有5.4s
先看我自己的
for(int i=0;i<n;i++)
{
if(b[i] == false && sum+v[i]<=m)
{
sum+=v[i];
b[i] =true;
dfs(v,i);
sum-=v[i];
b[i] = false;
}
我每一次都會對所有數字嘗試一次,所以要刪去的選項非常多,譬如 5 10 15 20 50 跟 5 10 15 50 20 是一樣的但是順序不一樣,而我想到的方法是在每次新增數字前都檢查是否比該數字大的已經有了,像這樣
for(int i=index+1;i<n;i++)if(b[i]==true)return;
而我猜就是因為這樣讓時間多了許多。
而另一種
dfs(n,pos+1,m-n[pos],f,t,check);//選擇此數
dfs(n,pos+1,m,f,t,check);//不選此數
沒有每次都全部嘗試,而是只嘗試下一個數字,所以自然沒有數字一樣順序不一樣的問題。就不用在跑一次for迴圈檢查是否已經有比較大的數字存在,因為本身就是按照大小嘗試的。