杭电2110(一维背包)

题目链接: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;
}

猜你喜欢

转载自blog.csdn.net/qq_39905917/article/details/87564779