#include<bits/stdc++.h>
using namespace std;
int n,m,a[507],dp[250005];//dp【j】表示当总共j元时的最小商品数
int main(){
memset(dp,0x3f3f3f3f,sizeof dp);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",a+i);
}
sort(a+1,a+n+1);
for(int i=2;i<=n;i++) a[i]-=a[1];
dp[0]=0;
int end=m*a[n];//最大钱数
for(int i=2;i<=n;i++){
for(int j=a[i];j<=end;++j){
if(dp[j]>dp[j-a[i]]+1)
dp[j]=dp[j-a[i]]+1;
}
}
for(int i=0;i<=end;i++){
if(dp[i]<=m)
printf("%d ",i+m*a[1]);//不够的可以用a【1】来补
}
return 0;
}
我们用dp【】来表示用i的钱最少可以买到的商品数
而end存放的是最大钱数,因为最多买m件,所以最多都是用来买最贵的咯
但是来,这题需要一个小小的优化,就是我先把从a【2】到a【n】全部剪掉a【1】这样,最后我用a【1】来凑,
看上图,如果我选择了2,3,4,5,6,但是要求6件,但这样也没关系,可以用1来凑,而2,3,4,5,6,每一个因为原先都砍掉了a【1】,所以就要再加上a【1】,相当于一共加了m个a【1】。
这一题,其实和noip2018的货币系统解法有些类似,那个就 等我ac之后再写吧。