【动态规划】【RQNOJ】购物问题
2010-07-12 09:17
239 查看
题目描述
由于换季,商场推出优惠活动,以超低价格出售若干种商品。但是商场为避免过分亏本,规定某些商品不能同时购买,而且每种超低价商品只能买一件。身为顾客的你想获得最大的实惠,也就是争取节省最多的钱。经过仔细研究,我们发现商场出售的超低价商品中,不存在以下这种情况: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。
输出格式
仅一行一个整数,表示能节省的最大金额数。样例输入
#include<stdio.h> #include<iostream> using namespace std; int g[1001][1001],t[1001][1001],f[1001][3],d[1001]; int a,b,k,m,ans; bool h[1001]; void build_tree(int x) { h[x]=true; for (int i=1;i<=g[x][0];++i) if (!h[g[x][i]]) { t[x][++t[x][0]]=g[x][i]; build_tree(g[x][i]); } } void dp(int x) { if (t[x][0]==0) { f[x][1]=d[x]; f[x][2]=0; } else { for (int i=1;i<=t[x][0];++i) dp(t[x][i]); for (int i=1;i<=t[x][0];++i) { int k=t[x][i]; f[x][1]+=f[k][2]; f[x][2]+=max(f[k][1],f[k][2]); } f[x][1]+=d[x]; } } int main() { scanf("%d%d",&k,&m); for (int i=1;i<=k;++i) scanf("%d",&d[i]); for (int i=1;i<=m;++i) { scanf("%d%d",&a,&b); g[a][++g[a][0]]=b; g[b][++g[b][0]]=a; } for (int i=1;i<=k;++i) if (g[i][0]==0) { h[i]=true; ans+=d[i]; } else if (!h[i]) { build_tree(i); dp(i); ans+=max(f[i][1],f[i][2]); } printf("%d/n",ans); return 0; }
PS:今天貌似浏览器有点问题,一刷新网页鼠标就闪啊闪的……
相关文章推荐
- RQNOJ 188 购物问题
- 最少费用购物问题,裸DP,动态规划
- 【动态规划】【RQNOJ】马棚问题
- 【动态规划】【RQNOJ】装箱问题
- 【解题报告】[动态规划] RQNOJ - PID105 / 核电站问题
- RQNOJ 188 购物问题
- RQNOJ188 购物问题
- 【解题报告】[动态规划] RQNOJ - PID273 / 马棚问题
- [动态规划]数塔问题
- poj 1163数字三角形问题--动态规划
- 动态规划---0-1背包问题
- 动态规划总结(背包问题的深入理解)
- 动态规划解最长公共子序列问题
- 动态规划(DP)问题状态方程合集
- 动态规划求RMQ(区间最值问题Range Minimum/Maximum Query)
- 动态规划——背包问题
- 动态规划 0-1背包问题(C语言描述)
- 动态规划——三角形问题
- 动态规划(Dynamic programming,DP),通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。通常许多
- 算法导论例程——切割钢条问题(动态规划)