社区讨论
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 条回复,欢迎继续交流。
正在加载回复...