链接:点击打开链接
题意:给出n个物品的价值,每个物品可以选择任意次,求恰好选择k次所有价值的情况
代码:
#include <vector>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int a[1005],dp[1000005];
int main(){
int n,m,i,j,tmp;
while(scanf("%d%d",&n,&m)!=EOF){
tmp=INF;
for(i=1;i<=n;i++){ //dp主要在于求最值,并不好求恰好的情况
scanf("%d",&a[i]); //所以将每个值嫁娶最小的值,求价值i时最
tmp=min(tmp,a[i]); //的个数
}
for(i=1;i<=n;i++)
a[i]-=tmp;
memset(dp,INF,sizeof(dp));
dp[0]=0;
for(i=0;i<=1000000;i++){
for(j=1;j<=n;j++)
if(i>=a[j])
dp[i]=min(dp[i],dp[i-a[j]]+1);
}
for(i=0;i<=1000000;i++)
if(dp[i]<=m)
printf("%d ",i+tmp*m); //再改为实际价值
printf("\n");
}
return 0;
}