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

hdu2110(多重背包/母函数)的更多相关文章

  1. 杭电1171 Big Event in HDU(母函数+多重背包解法)

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  2. HDU 1059 Dividing 分配(多重背包,母函数)

    题意: 两个人共同收藏了一些石头,现在要分道扬镳,得分资产了,石头具有不同的收藏价值,分别为1.2.3.4.5.6共6个价钱.问:是否能公平分配? 输入: 每行为一个测试例子,每行包括6个数字,分别对 ...

  3. HDU——1059Dividing(母函数或多重背包)

    Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. Holding Bin-Laden Captive!(1.多重背包 2.母函数)

    Holding Bin-Laden Captive! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...

  5. Coins(hdu 2844 多重背包)

    Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  6. Big Event in HDU(多重背包套用模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1171 Big Event in HDU Time Limit: 10000/5000 MS (Java/Othe ...

  7. 多重背包--java

    多重背包 有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是c[i],价值 是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大母函数的思想也 ...

  8. hdu1059 dp(多重背包二进制优化)

    hdu1059 题意,现在有价值为1.2.3.4.5.6的石头若干块,块数已知,问能否将这些石头分成两堆,且两堆价值相等. 很显然,愚蠢的我一开始并想不到什么多重背包二进制优化```因为我连听都没有听 ...

  9. 洛谷P1782 旅行商的背包[多重背包]

    题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ...

随机推荐

  1. C/C++之内存对齐

    数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍.DWORD数据的内存起始地址能被4除尽,WORD数据的内存起始地址能被2除尽.X86 CPU能直接访问对齐的数据,当它试图访问一个未对齐的数据 ...

  2. pyDay2

    内容来自廖雪峰的官方网站 1.dict 为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的.假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想 ...

  3. P2503 [HAOI2006]均分数据

    P2503 [HAOI2006]均分数据 模拟退火+dp (不得不说,我今天欧气爆棚) 随机出1个数列,然后跑一遍dp统计 #include<iostream> #include<c ...

  4. Python descriptor 以及 内置property()函数

    Python Descriptor  1, Python Descriptor是这样一个对象 它按照descriptor协议, 有这样的属性之一 def __get__(self, obj, type ...

  5. MySQL 5.7.18 解压版安装

    原文链接:https://my.oschina.net/u/3474266/blog/895696 我在安装免安装版的5.7.18的时候出现了问题,正好找到这个,十分感激 今天下载安装了MySQL C ...

  6. 51nod 1021 石子归并

    区间dp 递推比递归的常数要小  所以还是尽量学会递推吧 看题解  各种恶心啊  有木有 还是视频讲的直接呃   不过就是讲的有点儿慢 链接:https://www.bilibili.com/vide ...

  7. org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement profile

    原创:转载请注明出处 1.异常情况 org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected ...

  8. 《C语言程序设计》指针篇<二>

    通过指针引用多维数组 如何理解二维数组元素的地址? 要知道,这本书用了整整两页的内容来讲解这方面的知识,从这里足以看出来理解通过指针来引用二维数组是一件比较麻烦的事情,但是我认为理解并不难. 什么是二 ...

  9. UVa 11991 一道简单题

    https://vjudge.net/problem/UVA-11991 题意:给出一个包含n个整数的数组,你需要回答若干询问.每次询问两个整数k和v,输出从左到右第k个v的下标. 思路: 把每个数字 ...

  10. google nmt 实验踩坑记录

       最近因为要做一个title压缩的任务,所以调研了一些text summary的方法.    text summary 一般分为抽取式和生成式两种.前者一般是从原始的文本中抽取出重要的word o ...