社区讨论

蒟蒻求助

P1064[NOIP 2006 提高组] 金明的预算方案参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@lo8ardwj
此快照首次捕获于
2023/10/27 15:33
2 年前
此快照最后确认于
2023/10/27 15:33
2 年前
查看原帖
CPP
#include<iostream>
using namespace std;
const int N=32001;
int sumv,m,v[N][4],p[N][4],f[N];
int cnt=0;
int sum(int l,int r){
	int ans=0;
	for(int i=l;i<=r;i++){
		ans+=v[cnt][i];
	}
	return ans;
}
int score(int k){
	return v[cnt][k]*p[cnt][k];
}
int main(){
	std::ios::sync_with_stdio(false);
	cin>>sumv>>m;
	for(int i=1;i<=m;i++){
		int a,b,q;
		cin>>a>>b>>q;
		if(q==0){
			v[i][0]=a;
			p[i][0]=b;
		}
		else{
			if(v[q][1]==0){
				v[q][1]=a;
				p[q][1]=b;
			}
			else{
				v[q][2]=a;
				p[q][2]=b;
			}
		}
	}
	for(int i=1;i<=m;i++){
		cnt=i;
//		cout<<"QWQ"<<cnt<<endl;
		for(int j=sumv;j>=0;j--){
			if(f[j]>=sum(0,0)){	f[j]=max(f[j],f[j-sum(0,0)]+score(0));/*cout<<"qwq"<<f[j-sum(0,0)]<<" "<<score(0)<<" "<<j<<endl;*/}
			if(f[j]>=sum(0,1)){	f[j]=max(f[j],f[j-sum(0,1)]+score(0)+score(1));}
			if(f[j]>=sum(0,2)){	f[j]=max(f[j],f[j-sum(0,2)]+score(0)+score(1)+score(2));}
			if(f[j]>=v[i][0]+v[i][2]){	f[j]=max(f[j],f[j-v[i][0]-v[i][2]]+score(0)+score(2));}
		}
		
//		cout<<sum(0,0)<<" "<<sum(0,1)<<" "<<sum(0,2)<<" "<<v[i][0]+v[i][2]<<endl;
		cout<<score(0)<<" "<<score(0)+score(1)<<" "<<score(0)+score(1)+score(2)<<" "<<score(0)+score(2)<<endl;
	}
//	for(int i=1;i<=sumv;i++)	cout<<f[i]<<" ";
	cout<<f[sumv];
}



回复

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

正在加载回复...