社区讨论

30pts求调

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhj271xu
此快照首次捕获于
2025/11/03 19:30
4 个月前
此快照最后确认于
2025/11/03 19:30
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=34010;
int n,m,v[maxn],p[maxn],q[maxn]/*,nxt[maxn]*/,fu[maxn][3];
bool pd[maxn];
int dp[maxn],st[maxn],ans1,ans2,ans3,ans4;
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&v[i],&p[i],&q[i]);
	/*	nxt[i]=q[i];*/
		fu[q[i]][++st[q[i]]]=i;
        if(q[i]!=0)pd[i]=1;
        
	}
	for(int i=1;i<=m;i++){
		if(pd[i]==1)continue;
		for(int j=n;j>=v[i];j--){
			ans1=v[i];
			ans2=ans1+v[fu[i][1]];
			ans3=ans1+v[fu[i][2]];
			ans4=ans3+v[fu[i][1]];
             // cout<<ans1<<' '<<ans2<<' '<<ans3<<' '<<ans4<<endl;
			if(j-ans1>=0)dp[j]=max(dp[j],dp[j-ans1]+ans1*p[i]);
             // cout<<j<<' '<<dp[j]<<endl;
			if(j-ans2>=0)dp[j]=max(dp[j],dp[j-ans2]+ans1*p[i]+v[fu[i][1]]*p[fu[i][1]]);
              // cout<<j<<' '<<dp[j]<<endl;
			if(j-ans3>=0)dp[j]=max(dp[j],dp[j-ans3]+ans1*p[i]+v[fu[i][2]]*p[fu[i][2]]);
              // cout<<j<<' '<<dp[j]<<endl;
			if(j-ans4>=0)dp[j]=max(dp[j],dp[j-ans4]+ans1*p[i]+v[fu[i][1]]*p[fu[i][1]]+v[fu[i][2]]*p[fu[i][2]]);
              // cout<<j<<' '<<dp[j]<<endl;
		}
		
	}
	printf("%d",dp[n]);
	return 0;
}

回复

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

正在加载回复...