zoukankan      html  css  js  c++  java
  • hdu2110(多重背包/母函数)

    http://acm.hdu.edu.cn/showproblem.php?pid=2110

    就是个多重背包,有坑点-.-。注意答案模10000中间结果有可能会爆所以计算时就要取模;

    由于必须能均分三份所以总价值肯定能除尽3,只要计算出1/3总价值的方案数即可,也就是2/3总价值的方案数:

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    #define inf 0x3f3f3f3f
    int dp[100005];
    int main()
    {
    int n,m,i,j,k,sumn,t,c[105],p[105];
    while(cin>>n&&n){memset(dp,0,sizeof(dp));
    dp[0]=1;
    sumn=0;
    for(i=1;i<=n;++i) cin>>p[i]>>c[i],sumn+=p[i]*c[i];
    if(sumn%3!=0) {puts("sorry");continue;}
    sumn=sumn/3;
    for(i=1;i<=n;++i){
    for(j=sumn;j>=0;--j)
    for(k=1;k<=c[i];++k)
    if(j>=k*p[i]) dp[j]=(dp[j]+dp[j-k*p[i]])%10000;
    else break;
    }
    if(dp[sumn]) cout<<dp[sumn]%10000<<endl;
    else puts("sorry");
    }
    return 0;
    }

    下面是母函数:

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    #define ql(a) memset(a,0,sizeof(a))
    int price[105],num[105],a1[10005],a2[10005];
    int main()
    {
    int n,m,i,j,k,sumn;
    while(cin>>n&&n){sumn=0,ql(a1),ql(a2);
    for(i=1;i<=n;++i) cin>>price[i]>>num[i],sumn+=price[i]*num[i];
    if(sumn%3!=0) {puts("sorry");continue;}
    sumn/=3;
    for(i=0;i<=price[1]*num[1]&&i<=sumn;i+=price[1]) ++a1[i];
    for(i=2;i<=n;++i){
    for(j=0;j<=sumn;++j){
    for(k=0;k<=num[i]*price[i]&&k+j<=sumn;k+=price[i])
    a2[k+j]=(a2[k+j]+a1[j])%10000;
    }
    for(j=0;j<=sumn;++j) a1[j]=a2[j],a2[j]=0;
    }
    if(a1[sumn]) cout<<a1[sumn]%10000<<endl;
    else puts("sorry");
    }
    return 0;
    }

  • 相关阅读:
    React 生命周期
    css 多行文本以...代替
    微信JSSDK配置文件说明
    zepto阻止事件冒泡
    PHP 图片处理PNG颜色丢失
    React 学习笔记(一)
    webpack webpack-dev-server使用指南
    为什么需要使用模块打包工具?
    如何实现微信公户绑定公众号业务
    iOS 手势
  • 原文地址:https://www.cnblogs.com/zzqc/p/6612225.html
Copyright © 2011-2022 走看看