--- title: "背包问题具体方案" created: 2025-11-28 tags: - 算法 --- # 背包问题具体方案 注意 如果要具体路径 就不能压缩状态了 若没要求字典序 正着dp 反着推也是没问题的 反着dp 正着推 要求字典序 ```cpp #include using namespace std; const int N=1010; int w[N],v[N]; int f[N][N]; int path[N],cnt; int n,m; int main() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>v[i]>>w[i]; for(int i=n;i>=1;i--) { for(int j=0;j<=m;j++) { f[i][j]=f[i+1][j]; if(j>=v[i]) f[i][j]=max(f[i][j],f[i+1][j-v[i]]+w[i]); } } for(int i=1,j=m;i<=n;i++) { // 判断是否选取了当前物品 if(j>= v[i] && f[i][j]==f[i+1][j-v[i]]+w[i]){ path[cnt++]=i;// 记录选取的物品 j-=v[i];// 更新剩余容量 } } for(int i=0;i using namespace std; #define endl '\n' const int N=1010; int w[N],v[N]; int f[N][N]; int n,m; int path[N],cnt; int main() { ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n>>m; for(int i=1;i<=n;i++) cin>>v[i]>>w[i]; for(int i=1;i<=n;i++){ for(int j=0;j<=m;j++){ f[i][j]=f[i-1][j]; if(j>=v[i]) f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]); } } int cnt=0; for(int i=n,j=m;i;i--){ if(j>=v[i] && f[i][j]==f[i-1][j-v[i]]+w[i]){ path[cnt++]=i; j-=v[i]; } } for(int i=0;i