这是我的错误的 AC 代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,a[110][210];
int f[110][210],cnt[110][210];
int maxn,maxid;
void output(int i,int k)
{
if(i>1)output(i-1,k-cnt[i][k]);
cout<<i<<" "<<cnt[i][k]<<endl;
}
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++)
if(f[i-1][j-k]+a[i][k]>=f[i][j])
f[i][j]=f[i-1][j-k]+a[i][k],cnt[i][j]=k;
cout<<f[n][m]<<endl;
output(n,m);
return 0;
}
可以看到里面 f[i-1][j-k]+a[i][k]>=f[i][j] 这句话每次都让当前这个公司拿尽量多的机器,这显然是错的。比如这篇题解中的数据就能 hack。而且应该也能 hack 一些其他的问题。
也就是
3 6
10 10 1 1 1 1
10 1 10 1 1 1
10 10 10 1 1 1
它的答案应该是
30
1 1
2 1
3 1