题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2110
杭电2079也是一样的题型
看讨论区好多母函数,最后还是觉得一维背包的dp妙呀!
代码如下:
#include<bits/stdc++.h>
using namespace std;
int f[10010]; //状态数组
int main()
{
int n,p,m,sums;
while(cin>>n&&n!=0)
{
memset(f,0,sizeof(f));
f[0]=1; //初始化,重量为0时的方案有一种
sums=0;
for(int i=0;i<n;i++)
{
cin>>p>>m;
sums+=p*m;
for(int i=sums;i>=0;i--)
{
for(int j=1;j<=m;j++)
if(i-j*p>=0) f[i]=(f[i-j*p]+f[i])%10000; //如果可以装入背包
else break;
}
}
//当价值可以划分为三份时,并且价值不为空
if(sums%3==0&&f[sums/3]!=0) cout<<f[sums/3]%10000<<endl;
else cout<<"sorry"<<endl;
}
return 0;
}