邮票问题
时间限制: 1 Sec 内存限制: 128 MB提交: 15 解决: 7
[提交][状态][讨论版]
题目描述
设有已知面额的邮票m种,每种有n张。问:用总数不超过n张的邮票进行组合,能组合的邮票中可以连续出现面额数最多有多少(1<=m<=100,1<=n<=100,1<=邮票面额<=255)
输入
第一行:n和m的值,中间有一空格隔开
第二行:m种邮票的面额,每个数中间用一空格隔开。
第二行:m种邮票的面额,每个数中间用一空格隔开。
输出
连续面额数的最大值
样例输入
4 3
1 2 4
样例输出
14
用动态规划做的,f[i]表示邮票面值为i时需要最少的邮票张数
#include <iostream> #include <algorithm> #define INF 0x3f3f3f3f using namespace std; int f[25555]={0},a[105],m,n; int main() { cin>>n>>m; for(int i=0;i<25555;i++) f[i]=INF; for(int i=0;i<m;i++) cin>>a[i]; sort(a,a+m); f[0]=0; for(int i=a[0];i<=a[m-1]*n;i++) { for(int j=0;j<m;j++) { if(i>=a[j]) f[i]=min(f[i],f[i-a[j]]+1); } } int maxx=0,ans=0; for(int i=1;i<=a[m-1]*n;i++) { if(f[i]<=n) { ans++; } else { maxx=max(ans,maxx); ans=0; } } cout<<maxx<<endl; return 0; }