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





  • 相关阅读:
    VS2010安装SP1后无法安装VS2010 SDK
    c#异常机制
    精简2003,安装后控制面板无效,点击控制面板就闪一下,返回桌面
    转载 Microsoft .NET Pet Shop 4 架构与技术分析
    JavaScript实用的一些技巧
    asp.net开发常用技巧收集
    Ajax+PHP+jQuery图片截图上传
    如何利用WINPE制作恢复光盘/恢复分区
    C/C++跨平台计时,精确到毫秒级别
    SetLocalInfo修改系统时间,立即生效
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410992.html
Copyright © 2011-2022 走看看