【动态规划】【RQNOJ】购物问题

题目描述

由于换季,商场推出优惠活动,以超低价格出售若干种商品。但是商场为避免过分亏本,规定某些商品不能同时购买,而且每种超低价商品只能买一件。身为顾客的你想获得最大的实惠,也就是争取节省最多的钱。经过仔细研究,我们发现商场出售的超低价商品中,不存在以下这种情况:n(n>=3)种商品C1,C2,C3,……,Cn,其中Ci和Ci+1是不能同时购买的(i=1,2,……,n-1),而且C1和Cn也不能同时购买。
请编程计算可以接生的最大金额数。

输入格式

第一行两个整数K,M(1<=K<=1000),其中K表示超低价商品数,K种商品的编号依次为1,2,3,……,K;M表示不能同时购买的商品对数。
接下来K行,第i行有一个整数Xi表示购买编号为i的商品可以节省的金额(1<=Xi<=100)。
再接下来M行,每行两个数A,B,表示A和B不能同时购买,1<=A,B<=K,A≠B。

输出格式

仅一行一个整数,表示能节省的最大金额数。

样例输入

样例输出

三维状态图像


树形动态规划。

因为是一个森林,所以枚举每一个点,如果当前点没有被放入森林中,以当前点为根建一棵树。树满足性质:子节点和父节点不可同时取到。

记录两个状态f[x][1]和f[x][2],分别表示取x和不取x。

f[i,2]=Σ(max{f[j,1],f[j,2]} 因为不取x,所以根节点j可取可不取。
f[i,1]=∑(f[j,2]) +d[i];      因为取x,所以根节点都不能取。

PS:今天貌似浏览器有点问题,一刷新网页鼠标就闪啊闪的……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值