zoukankan      html  css  js  c++  java
  • hdu 2126背包问题

    /*有n件物品,旅客一共有m块大洋。第一个问题,旅客最多可以买多少件物品?请注意,这里是多少件,不是价值最大。所以这个非常好求,将所有的物品按照价值排序,先买便宜的,再买贵的。贪心的思想。这个地方有些细节需要处理,如果所有物品的价值总和比旅客的钱少,那么就只有一个方案,旅客可以买走所有的物品。如果旅客的钱数连第一件物品都买不起,那么就直接输出”Sorry,you
     can't buy anything.“。

    用这种方法,我们可以求出旅客最多买多少件物品,求出之后,物品的价格就有了两种属性,一种是钱数,一种是件数。也就是买一件物品需要的消耗是它的价格的钱数和1件物品的份额。在背包九讲中,这个叫做二维费用的背包问题。

    如果是求最优方案,这个问题依旧毫无压力。但是现在的问题是求方案总数。

    我们用dp[j][k]表示花费j元买k件物品的方案数,实际上很容易我们就可以得到dp[j][k]=dp[j][k]+dp[j-a[i]][k-1]。关于这个方程有两个需要特别解释的地方,第一个这个是空间优化后的方程,优化后的原理参见背包九讲第一讲01背包,这里不再叙述。我们需要知道的是dp[j][k]在这里指的是dp[i-1][j][k],也就是在考虑过第i-1件物品后dp[j][k]的方案数。这个解释了这个dp[j][k]为什么可以直接继承过来。第二个需要解释的是,在dp[j][k]和dp[j-a[i]][k-1]中有没有相同的方案,即我们有没有冒着重复计算的风险将两者相加。答案是没有。因为在dp[j-a[i]][k-1]这些方案中都有第i件物品,我们说过dp[j][k]实际上是dp[i-1][j][k],其中根本没有第i件物品的影子,所以两者不可能有重复的方案。*/

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    int cmp(const void *a,const void  *b ) {
    return *(int *)a-*(int *)b;
    }
    int dp[600][40];
    int a[40];
    int main() {
    int t,n,m,i,j,p,kind;
    scanf("%d",&t);
    while(t--) {
    memset(dp,0,sizeof(dp));
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    qsort(a,n,sizeof(a[0]),cmp);
            p=m;
    for(i=0;i<n;i++) {
    if(p-a[i]>=0)
                    p-=a[i];
    else
    break;
    }
    kind=i;
    if(kind==0) {
    printf("Sorry, you can't buy anything. ");
    continue;
    }
    for(i=0;i<=m;i++)
    dp[i][0]=1;
    for(i=0;i<n;i++)
    for(j=m;j>=a[i];j--)
    for(int k=kind;k>=1;k--)
    dp[j][k]=dp[j][k]+dp[j-a[i]][k-1];//dp[j-a[i]][k-1]包含第i种物品,dp[J][K]相当于dp[i-1][j[k]。每次考虑第i种物品来选方案数
    printf("You have %d selection(s) to buy with %d kind(s) of souvenirs. ",dp[m][kind],kind);
    }
    return 0;
    }





  • 相关阅读:
    面向对象的继承关系体现在数据结构上时,如何表示
    codeforces 584C Marina and Vasya
    codeforces 602A Two Bases
    LA 4329 PingPong
    codeforces 584B Kolya and Tanya
    codeforces 584A Olesya and Rodion
    codeforces 583B Robot's Task
    codeforces 583A Asphalting Roads
    codeforces 581C Developing Skills
    codeforces 581A Vasya the Hipster
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410992.html
Copyright © 2011-2022 走看看