73 分求救(背包)
查看原帖
73 分求救(背包)
338786
mushroom_knight楼主2020/7/24 10:56

RTRT,学第一篇题解用 0101 背包做的

但是 WAWA33 个点。

不知道为什么在输第 33 个点的时候,标答是 11

然后我却输出了 102102

代码在这儿,(用DevDev的调试调了好久没发现dp过程哪里有问题……输出过程太多根本找不到问题(# 3 n=10003\ n=1000))

#3数据:

(巨佬们勿喷,我不是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;
}

2020/7/24 10:56
加载中...