邮票问题
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 }