洛谷 P2725 邮票 Stamps

题意

判断从1开始的能凑出的连续的邮票价值(1~n),会给出两个数K和N,K是可用的邮票总数。N是邮票面值的数量。接下去的N行是每种邮票的价值

注意:每种邮票是可以多次使用

做法

完全背包模型,用一维即可,如果用二维会内存超限,记录的是凑足i的价值至少要多少邮票,如果大于K,输出i-1,跳出循换,如果没有跳出,输出最大可能性K*n(n是价值最大的邮票),详见代码

代码

#include<bits/stdc++.h>
using namespace std;
int k,n;
int a[55];
int f[2000005];//记录至少多少邮票凑足 
int main() 
{
    //freopen("inflate.in","r",stdin);
    //freopen("inflate.out","w",stdout);
    scanf("%d%d",&k,&n);
    int maxx=0;
    for(int i=1;i<=n;++i)
       scanf("%d",&a[i]),maxx=max(maxx,a[i]);//记录邮票中的最大值 
    f[0]=0;
    int l=maxx*k;//循换次数 
    for(int i=1;i<=l;++i)
    {
        for(int j=1;j<=n;++j)
            if(i>=a[j])//边界处理 
                f[i]=min(f[i]?f[i]:200000000,f[i-a[j]]+1);//比较前提是f[i]!=0 
        if(f[i]>k)//超出K的值要跳出 
        {
            cout<<i-1<<endl;
            return 0;
        }
    }   
    cout<<l<<endl;//没被return所以输出 
    return 0;
}

 

posted @ 2022-02-12 16:07  LikC1606  阅读(33)  评论(0)    收藏  举报