分组背包和背包求具体方案问题结合版
Posted 行码棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分组背包和背包求具体方案问题结合版相关的知识,希望对你有一定的参考价值。
题目链接
分组背包和背包求具体方案问题结合版
- 思路:
因为要求是字典序,我们倒序求分组背包最终结果的最大值。
最后得出来的最大值是f[1][m],所以现在就从该值往后面反推 - 注意:
求具体方案问题,状态表示需要是二维表示,对选择的组号进行区分
#include<bits/stdc++.h>
using namespace std;
const int N=12,M=18;
int f[N][M],w[N][M];
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) cin>>w[i][j];
for(int i=n;i>=1;i--)
{
for(int j=0;j<=m;j++)
{
f[i][j] = f[i+1][j];
for(int k=1;k<=j;k++)
f[i][j] = max(f[i][j],f[i+1][j-k]+w[i][k]);
}
}
cout<<f[1][m]<<'\\n';//最终的结果
int j=m;
for(int i=1;i<=n;i++)
{
cout<<i<<' ';
for(int k=1;k<=j;k++)
{
if(f[i][j]==f[i+1][j-k]+w[i][k]) //如果当前的最大值等于选择该物品的最优解,那么就选择该物品
{
cout<<k<<'\\n';
j-=k;//每次选之后都要容量减去相对应选择的容量
break;
}
}
}
return 0;
}
以上是关于分组背包和背包求具体方案问题结合版的主要内容,如果未能解决你的问题,请参考以下文章
[01背包] 背包问题求方案数(01背包+求方案数+求最优解方案数+思维)