Codeforce 632E(背包变形)

链接:点击打开链接

题意:给出n个物品的价值,每个物品可以选择任意次,求恰好选择k次所有价值的情况

代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
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;
}

你可能感兴趣的:(动态规划,---------背包)