前言
对我来说感觉不应是绿色啊。。
思路
选 j j j台的机器抽象成体积,然后直接跑一遍分组背包
但是这个路径输出怎么办呢
。。拓扑的直接dfs
我们可以从后往前dfs求出终点状态是从哪一个状态转移过来的
然后我们在网上继续dfs
CODE
// Problem: 混合背包问题
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/7/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
// Problem: P2738 [USACO4.1]���ʻ�·Fence Loops
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2738
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
#define px first
#define py second
#define pb push_back
typedef pair<int,int> pii;
int dxy[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
const int N = 30;
struct union_find_set{
int n,p[N];
void init(int N)
{
n = N;
for(int i=1;i<=n;i++)
p[i] = i ;
}
int find(int x)
{
if(p[x]!=x)return p[x] =find(p[x]);
return p[x];
}
bool set_union(int u,int v)
{
return (u = find(u)) ==(v == find(v))?false : p[v] = u ;
}
}ufs;
int n,m,t;
int f[N][N];
int w[N][N];
int path[N],idx;
void cal()
{
}
void dfs(int i,int j)
{
if(!i)
return;
for(int p = 0 ;p<=j;p++)
{
//找从哪个状态转移过来的
if(f[i-1][j-p] + w[i][p] == f[i][j])
{
path[idx++] = p;
dfs(i-1,j-p);
return;
}
}
}
void solve()
{
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++)
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]<<endl;
dfs(n,m);
for(int i = idx - 1, id = 1;i>=0;i--,++id)
{
cout<<id<<" "<<path[i]<<endl;
}
}
int main()
{
ios::sync_with_stdio(false);
solve();
return 0;
}