1. 程式人生 > 其它 >AcWing演算法提高課 1.3.3 揹包問題求方案

AcWing演算法提高課 1.3.3 揹包問題求方案

揹包問題求方案時,可以進行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;
    
for(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; }
View Code