RT,学第一篇题解用 01 背包做的
但是 WA 了 3 个点。
不知道为什么在输第 3 个点的时候,标答是 1
然后我却输出了 102
代码在这儿,(用Dev的调试调了好久没发现dp过程哪里有问题……输出过程太多根本找不到问题(# 3 n=1000))
(巨佬们勿喷,我不是ssd,自己肯定是要继续调的,只是发出来看看有没有巨佬看的出来问题)
#include<bits/stdc++.h>
using namespace std;
int f[1001][1001];
bool vis[1001][1001];
int v[1001];
int c[1001];
int n,m;
int basec;
int main(){
cin>>n;
for(register int i=1,x,y;i<=n;++i){
cin>>x>>y;
if(x>y){
v[i]=(x-y)*2;
c[i]=1;
m+=x-y;
}
if(x<y){
v[i]=(y-x)*2;
c[i]=-1;
m+=y-x;
basec+=1;
}
}
for(register int i=1;i<=n;++i){
for(register int j=1;j<=m;++j){
f[i][j]=f[i-1][j];
vis[i][j]=vis[i-1][j];
if(vis[i-1][j-v[i]]||j-v[i]==0){
if(!vis[i][j]){
f[i][j]=f[i-1][j-v[i]]+c[i];
vis[i][j]=1;
}
else{
f[i][j]=min(f[i][j],f[i-1][j-v[i]]+c[i]);
}
}
}
}
int tmp;
for(register int i=m;i>=1;i--){
if(vis[n][i]){
tmp=i;
break;
}
}
cout<<basec+f[n][tmp];
return 0;
}