邮票问题

邮票问题

Description

设有已知面额的邮票m种,每种有n张,用总数不超过n张的邮票,能从面额1开始,最多连续组成多少面额。(1≤m≤100,1≤n≤100,1≤邮票面额≤255)

Input

第一行:m,n的值,中间用一空格隔开。

第二行:A[1..m](面额),每个数中间用一空格隔开。

Output

连续面额数的最大值

Sample Input

3  4
1  2  4

Sample Output

14

感觉和去年提高组第一题有些相似之处,虽然做法不同但说的都是同一件事。所以就把这个小问题解决掉。
说是递推,其实有点像最简单的动归。写出来很简单,但自己想的话不知道为什么总是不知道如何下手..
 1 #include <iostream>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <cstdlib>
 6 #include <algorithm>
 7 using namespace std;
 8 int a[105],s[25600];
 9 int main()
10 {
11     int n,m;
12     scanf("%d%d",&n,&m);
13     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
14     sort(a+1,a+n+1);
15     if(a[1]!=1) printf("0");
16     else
17     {
18         s[1]=1;
19         for(int i=2;;i++)
20         {
21             for(int j=1;j<=n && a[j]<=i;j++)
22             {
23                 if(s[i]==0 || s[i]>s[i-a[j]]+1) s[i]=s[i-a[j]]+1;
24             }
25             if(s[i]>m) {printf("%d",i-1);break;}
26         }
27     }
28     return 0;
29 }
2-4-O


 
原文地址:https://www.cnblogs.com/YXY-1211/p/8384958.html