二刷提高课,题解目录在这里— 提高课的题解目录
因为每个公司都有拥有1~n个机器的权利,所以我们可以将每个公司看成一组物品
一个公司拥有不同数量机器所贡献的价值看成这组背包的内容
还有一个点就是这里要求一下背包的具体方案,我们需要从后往前枚举
当符合我们当初的状态转移方程时也就是我们选了这组背包
#include<iostream>
using namespace std;
int w[15][20];
int f[15][20];
int wa[20];
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=1;i<=n;i++)
{
for(int j=1;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[n][m]<<endl;
//求具体方案数
int j=m;
for(int i=n;i>=1;i--)
{
for(int k=0;k<=j;k++)
{
if(f[i][j]==f[i-1][j-k]+w[i][k])
{
wa[i]=k;
j-=k;
break;
}
}
}
for(int i=1;i<=n;i++)
cout<<i<<" "<<wa[i]<<endl;
return 0;
}