洛谷 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; }

浙公网安备 33010602011771号