题目传送门
解题思路:
f[i]表示凑总面值i所需的最少邮票张数,然后快乐的跑完全背包.
AC代码:
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring> using namespace std; int k,n,a[],aa,now,f[];
map<int,bool> vis; int main() {
scanf("%d%d",&k,&n);
for(int i = ;i <= n; i++) {
scanf("%d",&a[i]);
aa = max(aa,a[i]);
}
memset(f,0x3f3f3f,sizeof(f));
f[] = ;
for(int i = ;i <= n; i++) f[a[i]] = ;
for(int i = ;i <= n; i++)
for(int j = a[i];j <= aa * k; j++)
f[j] = min(f[j],f[j-a[i]] + );
for(int i = ;i <= aa * k; i++)
if(f[i] > k) {
printf("%d",i - );
return ;
}
printf("%d",k * aa);
return ;
}