输入输出:

id=26127" style="color:blue; text-decoration:none">Sample
Input

  1. 5
  2. 2
  3. 4 1 4 12 21
  4. 4 1 5 12 28
  5. 10
  6. 2
  7. 5 1 7 16 31 88
  8. 5 1 15 52 67 99
  9. 6
  10. 2
  11. 3 1 5 8
  12. 4 1 5 7 8
  13. 0

id=26127" style="color:blue; text-decoration:none">Sample
Output

  1. max coverage = 71 : 1 4 12 21
  2. max coverage = 409 : 1 7 16 31 88
  3. max coverage = 48 : 1 5 7 8

题意:

最多用S个邮票拼出最大连续数值,每组共同拥有N组例子,每组第一个是数组元素个数,输出字典序最小的一组。

用二维的状态事实上就能够了,i,j,k分别表示取到数组前i位用j个邮票能否拼出k,感觉有点像背包,输入并不都是排好序的,须要排序。

代码:

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<map>
  5. #include<cstring>
  6. #include<vector>
  7. #include<algorithm>
  8. #define INF 0X3f3f3f3f
  9. #define mem(a,b) memset(a,b,sizeof(a))
  10. using namespace std;
  11.  
  12. typedef long long ll;
  13. typedef unsigned long long llu;
  14. const int maxd=10+5;
  15. int n,s;
  16. vector<int> st[maxd];
  17. int dp[maxd][1005];
  18.  
  19. bool ok(int x)
  20. {
  21. for(int j=0; j<=s; ++j)
  22. if(dp[j][x])
  23. return true;
  24. return false;
  25. }
  26.  
  27. bool cmp(const vector<int> &a ,const vector<int> &b)
  28. {
  29. int lena=a.size(),lenb=b.size();
  30. if(lena==lenb)
  31. for(int i=lena-1;i>=0;--i)
  32. if(a[i]!=b[i]) return a[i]<b[i];
  33. return lena<lenb;
  34. }
  35.  
  36. int solve(int x)
  37. {
  38. mem(dp,0);
  39.  
  40. int len=st[x].size();
  41. int c=st[x][len-1]*s;
  42.  
  43. for(int j=0; j<=s; ++j) dp[j][0]=1;
  44. // for(int i=0; i<=len; ++i) dp[i][0][0]=1;
  45.  
  46. for(int i=1; i<=len; ++i)
  47. {
  48. // memcpy(dp[i],dp[i-1],sizeof(dp[i]));
  49. for(int j=1; j<=s; ++j)
  50. {
  51. int w=j*st[x][i-1];
  52.  
  53. for(int m=j; m<=s; ++m)
  54. for(int k=w; k<=c; ++k)
  55. if(dp[m-j][k-w])
  56. dp[m][k]=1;
  57. }
  58. }
  59.  
  60. int ans=0;
  61. for(int i=1; i<=c; ++i)
  62. {
  63. if(ok(i)) ans=i;
  64. else break;
  65. }
  66.  
  67. return ans;
  68.  
  69. }
  70.  
  71. int main()
  72. {
  73. freopen("1.txt","r",stdin);
  74. while(scanf("%d",&s)==1 && s)
  75. {
  76. scanf("%d",&n);
  77. for(int i=0; i<n; ++i)
  78. {
  79. int x,tmp;
  80. st[i].clear();
  81. scanf("%d",&x);
  82. for(int j=0; j<x; ++j)
  83. scanf("%d",&tmp),st[i].push_back(tmp);
  84. sort(st[i].begin(),st[i].end());
  85. }
  86. sort(st,st+n,cmp);
  87.  
  88. int ans=0,pos=-1;
  89. for(int i=0; i<n; ++i)
  90. {
  91. int tmp=solve(i);
  92. // cout<<tmp<<endl;
  93. if(tmp>ans)
  94. {
  95. ans=tmp;
  96. pos=i;
  97. }
  98. }
  99.  
  100. printf("max coverage =%4d :",ans);
  101. for(int i=0; i<st[pos].size(); ++i)
  102. printf("%3d",st[pos][i]);
  103. printf("\n");
  104. }
  105. return 0;
  106. }

uva--242(邮资问题 dp)的更多相关文章

  1. UVA.674 Coin Change (DP 完全背包)

    UVA.674 Coin Change (DP) 题意分析 有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值. 每种硬币的数量是无限的.典型完全背包. 状态 ...

  2. uva 10817(数位dp)

    uva 10817(数位dp) 某校有m个教师和n个求职者,需讲授s个课程(1<=s<=8, 1<=m<=20, 1<=n<=100).已知每人的工资c(10000 ...

  3. UVa 242 Stamps and Envelope Size (无限背包,DP)

    题意:信封上最多贴S张邮票.有N个邮票集合,每个集合有不同的面值.问哪个集合的最大连续邮资最 大,输出最大连续邮资和集合元素. 最大连续邮资是用S张以内邮票面值凑1,2,3...到n+1凑不出来了,最 ...

  4. UVA - 242 线性DP

    题意:给定多种邮票的组合,邮票最多只能用S张,这些邮票能组成许多不同面额,问最大连续面额的长度是多少,如果有多个组合输出组合中邮票数量最少的,如果仍有长度一致的,输出邮票从大到小排序后字典序最大的那个 ...

  5. uva 242

    242 - Stamps and Envelope Size Time limit: 3.000 seconds  Stamps and Envelope Size  Philatelists hav ...

  6. UVA 11404 Palindromic Subsequence[DP LCS 打印]

    UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...

  7. Uva 242 邮票和信封

    题目链接:https://vjudge.net/contest/146179#problem/D 题意: 信封上最多贴S张邮票.有N个邮票集合,每个集合有不同的面值.问哪个集合的最大连续邮资最大,输出 ...

  8. uva 10453 - Make Palindrome(dp)

    题目链接:10453 - Make Palindrome 题目大意:给出一个字符串,通过插入字符使得原字符串变成一个回文串,要求插入的字符个数最小,并且输出最后生成的回文串. 解题思路:和uva 10 ...

  9. uva 10671 - Grid Speed(dp)

    题目链接:uva 10671 - Grid Speed 题目大意:给出N,表示在一个N*N的网格中,每段路长L,如今给出h,v的限制速度,以及起始位置sx,sy,终止位置ex,ey,时间范围st,et ...

  10. uva 1331 - Minimax Triangulation(dp)

    option=com_onlinejudge&Itemid=8&page=show_problem&category=514&problem=4077&mosm ...

随机推荐

  1. Java从零开始学三十八(JAVA IO- 重定向IO)

    一.三个静态变量 java.lang.System提供了三个静态变量 System.in(默认键盘) System.out(默认显示器) System.err 二.重写向方法 System提供了三个重 ...

  2. 算法笔记_169:历届试题 兰顿蚂蚁(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种. 平面上的正方形格子被填上黑色或白色.在其中一格正方形内有一只“蚂 ...

  3. 纯jascript解决手机端拍照、选图后图片被旋转问题

    需要的js1 需要的js2 这里主要用到Orientation属性. Orientation属性说明如下: 旋转角度 参数 0° 1 顺时针90° 6 逆时针90° 8 180° 3 <!DOC ...

  4. oracle 批量更新表字段

      (一) 将数字替换成汉字 第一步,去重查询 使用distinct关键字先对该字段值进行去重查询,看共有几种情况 --查询指定区间内表停诊字段的值 SELECT DISTINCT T.CLOSE_T ...

  5. [TODO]com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method

    异常信息如下: 2018-10-30 20:00:50.230 ERROR java.util.concurrent.ExecutionException: com.alibaba.dubbo.rpc ...

  6. 初学者的React全家桶完整实例

    概述 该项目还有些功能在开发过程中,如果您有什么需求,欢迎您与我联系.我希望能够通过这个项目对React初学者,或者Babel/webpack初学者都有一定的帮助.我在此再强调一下,在我写的这些文章末 ...

  7. 利用cURL会话获取一个网页

    1.curl_init 作用:     初始化一个新的会话.返回一个cURL句柄,供curl_setopt(), curl_exec()和curl_close() 函数使用. 格式:    curl_ ...

  8. 原生php如何获取当前页面的url

    原生php如何获取当前页面的url? //php获取当前访问的完整url地址 function get_current_url(){ $current_url='http://'; if(isset( ...

  9. Nginx的HTTPS 301重定向到另一个TLD(托管在同一服务器上)没有显示出SSL警告

    我自己 example.com, .com.au, .net, .net.au, ... (8 in total). 我想所有的这些顶级域名以301的域名重定向到安全.COM域 https://www ...

  10. HDUOJ---三角形(组合数学)

    http://acm.hdu.edu.cn/showproblem.php?pid=1249 三角形 Time Limit: 2000/1000 MS (Java/Others)    Memory ...