我在本题遇到了一些麻烦
#include<bits/stdc++.h>
using namespace std;
struct node {
int h, t;
};
bool cmp(const node &x, const node &y) {
return x.h > y.h;
}
int f[3][2200][2200];
node x[100];
int main() {
int n;
scanf("%d", &n);
for (register int i(1); i <= n; ++i)
scanf("%d%d", &x[i].h, &x[i].t);
sort(x + 1, x + 1 + n, cmp);
long long ans(LONG_LONG_MAX);
int sum(0);
for (register int i(1); i <= n; ++i) {
sum += x[i].t;
int o(i & 1);
for (register int a(0); a <= sum; ++a)
for (register int b(0); b <= sum - a; ++b) {
f[o][a][b] = INT_MAX;
int c(sum - a - b);
if (x[i].t == a) f[o][a][b] = min(f[o][a][b], f[o ^ 1][0][b] + x[i].h);
if (x[i].t < a) f[o][a][b] = min(f[o][a][b], f[o ^ 1][a - x[i].t][b]);
if (x[i].t == b) f[o][a][b] = min(f[o][a][b], f[o ^ 1][a][0] + x[i].h);
if (x[i].t < b) f[o][a][b] = min(f[o][a][b], f[o ^ 1][a][b - x[i].t]);
if (x[i].t == c) f[o][a][b] = min(f[o][a][b], f[o ^ 1][a][b] + x[i].h);
if (x[i].t < c) f[o][a][b] = min(f[o][a][b], f[o ^ 1][a][b]);
}
}
for (register int a(1); a <= sum; ++a)
for (register int b(1); b <= sum - a; ++b) {
int c(sum - a - b);
if (c <= 0) continue;
if (f[n & 1][a][b] >= 0)
ans = min(ans, (long long)f[n & 1][a][b] * (long long)max(max(a, b), c));
}
printf("%lld\n", ans);
return 0;
}
该代码题交评测只有10pts。
#include<bits/stdc++.h>
using namespace std;
struct node{
int h,t;
}x[100];
bool cmp(node x,node y){
return x.h>y.h;
}
int f[3][2200][2200];
int n,m,i,a,b,sum,c,o;
long long ans;
int main()
{
scanf("%d",&n);
for (register int i=1;i<=n;i++)
scanf("%d %d",&x[i].h,&x[i].t);
sort(x+1,x+1+n,cmp);
ans=100000000;
f[0][0][0]=0;
for (register int i=1;i<=n;i++)
{
sum+=x[i].t;
o=i&1;
for (register int a=0;a<=sum;a++)
for (register int b=0;b<=sum-a;b++)
{
f[o][a][b]=100000000;
c=sum-a-b;
if (x[i].t==a) f[o][a][b]=min(f[o][a][b],f[o^1][0][b]+x[i].h);
if (x[i].t<a) f[o][a][b]=min(f[o][a][b],f[o^1][a-x[i].t][b]);
if (x[i].t==b) f[o][a][b]=min(f[o][a][b],f[o^1][a][0]+x[i].h);
if (x[i].t<b) f[o][a][b]=min(f[o][a][b],f[o^1][a][b-x[i].t]);
if (x[i].t==c) f[o][a][b]=min(f[o][a][b],f[o^1][a][b]+x[i].h);
if (x[i].t<c) f[o][a][b]=min(f[o][a][b],f[o^1][a][b]);
}
}
for (register int a=1;a<=sum;a++)
for (register int b=1;b<=sum-a;b++){
int c=sum-a-b;
if(c<=0) continue;
if (f[n&1][a][b]>=0)
ans=min(ans,(long long)f[n&1][a][b]*(long long)max(max(a,b),c));
}
printf("%lld\n",ans);
}
老师给出的标程是满分,可是我并没有找到实质性的不同,可以帮忙看一下有什么不同的吗