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

  • 相关阅读:
    CSS3box-shadow属性的使用
    IE7下z-index失效问题
    CSS3的writing-mode属性
    eclipse Java EE安装和web项目的创建
    用JS去掉前后空格或中间空格大全
    webstorm自带debugger服务器
    用meta标签让网页用360打开时默认为极速模式
    移动端可拖动导航菜单小demo
    DCL并非单例模式专用
    领域专用语言
  • 原文地址:https://www.cnblogs.com/zzqc/p/6612225.html
Copyright © 2011-2022 走看看