• hdu_2844_Coins(多重背包)


    题目连接:hdu_2844_Coins

    题意:给你n个硬币的价值和对应的数量,问你从1到m有那些数能组合出来

    题解:如果我们将硬币的价值看成一个物品的容量和价值,那么对应1-m,如果dp[i]==i,那么这个数就能组合出来,所以这题就变成了一个多重背包,多重背包可以分为完全和01背包,也可以直接用01背包做,分两种情况的速度要快一些,只用01背包的速度要慢一些,不过还是可以AC的

     1 #include<cstdio>
     2 #include<cstring>
     3 #define F(i,a,b) for(int i=a;i<=b;i++)
     4 inline void up(int &x,int y){if(x<y)x=y;}
     5 
     6 int n,m,x,y,a[111],b[111],bag[10001],ed,dp[100010];
     7 
     8 int main(){
     9     while(~scanf("%d%d",&n,&m),n+m){
    10         ed=0;
    11         F(i,1,n)scanf("%d",a+i);
    12         F(i,1,n)scanf("%d",b+i);
    13         F(i,1,n){
    14             int x=a[i],y=b[i];
    15             F(j,0,10){
    16                 if((1<<j)>y)break;
    17                 bag[++ed]=x*(1<<j);
    18                 y-=(1<<j);
    19             }
    20             if(y>0)bag[++ed]=y*x;
    21         }
    22         memset(dp,0,sizeof(dp));
    23         F(i,1,ed)for(int j=m;j>=bag[i];j--)up(dp[j],dp[j-bag[i]]+bag[i]);
    24         int ans=0;
    25         F(i,1,m)if(dp[i]==i)ans++;
    26         printf("%d
    ",ans);
    27         
    28     }
    29     return 0;
    30 }
    View Code
  • 相关阅读:
    Spark RDD 创建(一)
    编译Spark-1.6.0源码
    Strom学习笔记一
    Hbase笔记——RowKey设计
    Hbase物理模型
    HDFS分布式文件系统设计思想
    Hbase 基本命令
    内部排序算法
    278. First Bad Version
    266. Palindrome Permutation
  • 原文地址:https://www.cnblogs.com/bin-gege/p/5696086.html
Copyright © 2020-2023  润新知