标签:aa cnt P1899 bb val int 魔法 物品 dp
非常好的一道dp题目!!!!
首先对于普通物品和b-a<=p的魔法物品 直接用a值卖掉就好
卖完之后我们手头有val的钱
分两种情况:
1.假如此时val>=p
那么剩下的魔法物品都可以卖了,因为保证买完一个魔法物品钱一定任大于p
2.假如此时val<p
我们就要先卖魔法物品的a值(因为不够买卷轴),等到凑够p以后,问题就又回到1了
现在关键就是怎么凑到p才能使得最后结果最大
设dp[i]表示凑到i的时候 损失最小为多少
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
#define inf 1e9
const int maxn=5e3+5;
int dp[maxn<<1];
int cnt,n,P,val,maxx,tot,ans=1e9;
struct node{
int a,b,cha;
}v[maxn];
int main(){
string in;
cin>>n>>P;
getline(cin,in);//读取换行符 不能用getchar()
for(int i=1;i<=n;i++){
stringstream st;//黑科技
getline(cin,in);
int aa,bb;
st<<in;st>>aa;
if(st>>bb&&bb-aa>=P){
v[++cnt].a=aa;
v[cnt].b=bb;
v[cnt].cha=bb-aa-P;
maxx+=aa;
tot+=v[cnt].cha;
}else
val+=aa;
}
if(val>=P){
for(int i=1;i<=cnt;i++)
val+=(v[i].b-P);
cout<<val<<endl;
return 0;
}
for(int i=0;i<=val;i++)dp[i]=0;
for(int i=val+1;i<=val+maxx;i++)dp[i]=inf;
for(int i=1;i<=cnt;i++)
for(int j=val+maxx;j-v[i].a>=0;j--)
dp[j]=min(dp[j],dp[j-v[i].a]+v[i].cha);
for(int i=P;i<=val+maxx;i++)
ans=min(ans,dp[i]);
if(ans==inf){
cout<<val+maxx<<endl;
return 0;
}
cout<<tot+val+maxx-ans<<endl;
return 0;
}
标签:aa,cnt,P1899,bb,val,int,魔法,物品,dp 来源: https://www.cnblogs.com/wzxbeliever/p/16078395.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。