社区讨论

背包问题求助,55pts

P1941[NOIP 2014 提高组] 飞扬的小鸟参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lxh3o0ye
此快照首次捕获于
2024/06/16 13:22
2 年前
此快照最后确认于
2024/06/16 16:19
2 年前
查看原帖
问题应该出在管道上
CPP
#include <bits/stdc++.h>
#define re register
const int INF=0x3f3f3f3f;

int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a>b?a:b;}
int n,m,k;
int x[10009],y[10009];
int g[1009],f[1009];
int l[10009],h[10009];
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++){//0;i<n
		scanf("%d%d",&x[i],&y[i]);
	}
	for(int i=1;i<=k;i++){
		int p;scanf("%d",&p);
		scanf("%d%d",&l[p],&h[p]);
	}
	memset(f,0x3f,sizeof f);
	int cnt=0;
	for(int i=1;i<=n;i++){
		if(!h[i]){
			for(int j=x[i]+1;j<=m;j++){//i-1
				f[j]=min(f[j-x[i]]+1,g[j-x[i]]+1);
			}//完全背包
			for(int j=m-x[i]+1;j<=m;j++){
				f[m]=min(f[m],g[j]+1);
			}
			for(int j=m-y[i];j;j--){
				f[j]=min(f[j],g[j+y[i]]);
			}
		}else{
			for(int j=x[i]+1;j<=h[i]-1;j++){
				f[j]=min(f[j-x[i]]+1,g[j-x[i]]+1);
			}//
			for(int j=l[i]+1;j<=min(h[i]-1,m-y[i]);j++){
					f[j]=min(f[j],g[j+y[i]]);
				}
			int ans=INF;
			for(int j=l[i]+1;j<=h[i]-1;j++)
				if(f[j]<ans){
					ans=f[j];cnt++;
					break;
				}
			if(ans==INF){
				printf("0\n%d",cnt);return 0;
			}
		}
		memcpy(g,f,sizeof g);memset(f,0x3f,sizeof f);
	}
	int res=INF;
	for(int i=1;i<=m;i++){
		if(g[i]<res)res=g[i];
	}
	printf("1\n%d",res);
	
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...