今天做了一道01揹包加最小字典序輸出的問題,就稍微總結一下然後說些理解,如果有錯還望大神指出。
題目位址戳這裡
路徑的儲存有兩種方法,一種是用path二維陣列記錄一下路徑,另一種是直接根據dp陣列逆著找回去.
第一種方法:優化後和沒優化的dp陣列都可以使用
第二種方法:只能用於沒有優化後的dp陣列,一維存的資訊不夠.(因為一維邊存邊丟.)
至於要輸出字典序最小的方案,採取貪心的思想,從第乙個物品開始判斷取還是不取,那麼此時在dp的時候我們也要從後往前看每個物品。而要輸出字典序最大的方案那麼就直接從後面向前面看就可以了
for(int i=1;i<=n;i++) //n個物品,用結構體input儲存}}
int i=n,j=m;
while(i&&j)
i--;
}
方法二
for(int i=1;i<=n;i++) //n個物品,用結構體input儲存
}int i=n,j=m;
while(i&&j)
i--;
}
//如果要輸出最小字典序
for(
int i=n;i>=
1;i--
)//從最後乙個物品開始拿,此時dp[i][j]表示後n-i+1個物品中體積為j時的最大價值
}//輸出路徑的方案
int i=
1,j=v;
while
(i<=n&&j>0)
//從第乙個物品開始看拿沒拿
//拿了就輸出,再把體積減去,值得注意一下的是邊界條件j>=v[i],如果沒有這個條件的話就會出現陣列下標越界答案出錯。
i++;//判斷下乙個物品
}
字典序輸出
這一類的題目在面試中的演算法是比較常見的,這裡也自己做乙個總結 從陣列的末尾開始,首先找到第乙個公升序的數字對,然後交換這個數字對,然後從這個數字對開始,按照生序交換後面的所有數字。將1 n個整數按字典順序進行排序,返回排序後第m個元素 給定乙個整數n,給定乙個整數m,將1 n個整數按字典順序進行排...
BFS求最短路徑並且輸出最小字典序路徑
題目鏈結 題目很好理解大家自己去看一下就好,大致思路就是bfs求出路徑並且利用陣列記錄一下路徑,b nx ny b x y 1代表 x,y 是 nx,ny 的字首,這個技巧很好用,從乙個大佬那裡學來的 heihei 然後我們需要從終點開始作為bfs的起點,並且記錄路徑,這樣做的目的就是保證了我們記錄...
uva1599 雙向bfs 路徑字典序輸出
題意 紫書上有。思路 首先逆向bfs一遍,求出其他所有點到終點的最短距離。然後正著bfs一遍,每次選擇和當前節點到終點距離少1的點,且更新這一步的所選擇的顏色。這樣列印路徑直接按照步數列印就可以了 其他方式地列印都很麻煩 本題有乙個特別需要注意地地方 字典序最小是整體的,因此不能單單判斷到某個點的顏...