AT_dp_c Vacation题解
题目描述
暑假有 N 天。对于每一天 i(1≤i≤N),太郎君可以选择以下活动之一:
- A:在海里游泳,获得幸福度 ai。
- B:在山上抓虫,获得幸福度 bi。
- C:在家做作业,获得幸福度 ci。
由于太郎君容易厌倦,他不能连续两天及以上做同样的活动。
请计算太郎君可以获得的最大总幸福度。
输入格式
输入以以下格式从标准输入中提供:
N
a1 b1 c1
a2 b2 c2
…
aN bN cN
输出格式
输出太郎君可以获得的最大总幸福度。
限制条件
- 所有输入均为整数。
- 1≤N≤105
- 1≤ai,bi,ci≤104
样例解释 1
按顺序选择活动 C, B, C,可以获得的总幸福度为 70+50+90=210。
样例解释 3
按顺序选择活动 C, A, B, A, C, B, A 可以获得最大总幸福度。
Translated by User 735713.
显示翻译
题意翻译
输入输出样例
输入 #1复制
3 10 40 70 20 50 80 30 60 90
输出 #1复制
210
输入 #2复制
1 100 10 1
输出 #2复制
100
输入 #3复制
7 6 7 8 8 8 3 2 5 2 7 8 6 4 6 8 2 3 4 7 5 1
输出 #3复制
46
思路
DP。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long eee,n,m,jkj,lll=0,n17,u23,a,s2[10000001],ni[120][101],nj[101],nk[101],b[100001],c[54],d[100001],k,kkk,p,ss[100001][51],sd[100001],sw,t,z0,z1,u0,sc,s0,sm,sx;
long long n8[101][101],n4[100101012];
struct ll{
int s,e;
}z[10000001];
ll z2[10000001],z3[10000001],zx[10000001];
bool cmp(ll a,ll b){
return a.s<b.s;
}
bool cmp2(ll a,ll b){
return a.e<b.e;
}
bool cmp3(ll a,ll b){
return a.e-a.s<b.e-b.s;
}
int main(){
//map<long long,long long> n4;
cin>>n>>m;
for(long long i=1;i<=n;i++){
cin>>s2[i]>>sd[i];
jkj+=sd[i];
}
n4[0]=1;
for(long long i=1;i<=n;i++){
for(long long j=jkj-sd[i];j>=0;j--){
if(n4[j]>=1){
if(n4[j+sd[i]]>0) n4[j+sd[i]]=min(n4[j+sd[i]],n4[j]+s2[i]);
else n4[j+sd[i]]=n4[j]+s2[i];
}
}
}
for(long long i=1e7;i>=0;i--){
if(n4[i]!=0&&n4[i]<=m+1){
cout<<i;
break;
}
}
return 0;
}

浙公网安备 33010602011771号