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