题目
题解思路
把设备数看成体积就是和分组背包一模一样了
这里逆推出决策情况的很巧妙
从最后一次的决策由来往前推 不断减少体积 找到答案
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
using namespace std;
const int INF = 0x3f3f3f3f;
int w[110][110];
int f[110][110];
int way[110];
int main ()
{
ios::sync_with_stdio(false);
int n,m;
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 = 0 ; j <= m ; j++ )
{
f[i][j] = f[i-1][j];
for(int k = 0 ; k <= j ; k++ )
{
f[i][j] = max( f[i][j] , f[i-1][j-k] + w[i][k] ) ;
}
}
}
cout<<f[n][m]<<"\n";
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] )
{
way[i] = k;
j -= k ;
break;
}
}
}
for (int i = 1 ; i <= n ; i++ )
{
cout<<i<<" "<<way[i]<<"\n";
}
return 0 ;
}