AcWing演算法提高課 1.3.3 揹包問題求方案
阿新 • • 發佈:2022-05-28
揹包問題求方案時,可以進行dp過後,根據結果進行反推。
要求輸出方案時,不能簡化dp陣列的維數。
當需要以字典序最小輸出結果時,可以考慮從後向考慮物品,從後向前構建dp陣列。
這樣,反推的時候就可以從第一個物品開始考慮,就可以貪心的解決字典序問題。
(也可以使用標記陣列解)
例題 AcWing12. 揹包問題求具體方案
程式碼如下
#include<bits/stdc++.h> using namespace std; int vs[1010]; int nums[1010]; int dp[1010][1010]; int main() { int N,V; cin>>N>>V;View Codefor(int i=1;i<=N;i++) { cin>>vs[i]>>nums[i]; } for(int i=N;i>=1;i--) { int v=vs[i],num=nums[i]; for(int j=0;j<=V;j++) { dp[i][j]=dp[i+1][j]; if(j>=v) dp[i][j]=max(dp[i][j],dp[i+1][j-v]+num); } }int cur_v=V; for(int i=1;i<=N;i++) { if(cur_v>=vs[i]&&dp[i][cur_v]==dp[i+1][cur_v-vs[i]]+nums[i]) { cout<<i<<' '; cur_v-=vs[i]; } else { ; } } cout<<endl; }