作者:
月息
,
2023-01-24 18:58:42
,
所有人可见
,
阅读 5
#include <iostream>
#include <algorithm>
using namespace std;
int n,m;
int a[20][20];
int f[20][20];
int way[20];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
for(int k=0;k<=j;k++){
f[i][j]=max(f[i][j],f[i-1][j-k]+a[i][k]);//第i组从剩余小于等于m的j个设备中选取k个
}
}
}
cout<<f[n][m]<<endl;
int j=m;
for(int i=n;i>=0;i--){
for(int k=0;k<=j;k++){
if(f[i][j]==f[i-1][j-k]+a[i][k]){
way[i]=k;//代表第i个分组背包选择的是k个
j-=k;
break;
}
}
}
for(int i=1;i<=n;i++){
cout<<i<<" "<<way[i]<<endl;
}
return 0;
}