您的位置:首页 > 其它

poj 3046 分组背包

2015-10-14 21:46 429 查看
分组背包问题在于如何将问题看作分组。

一旦弄清了 分组 和 背包 就可以直接套模板

第一个循环 分组循环

第二个循环 背包循环

第三个循环 分组内循环

#include<iostream>
#include <string>
#include<vector>
#include<algorithm>
#include<set>
#include<fstream>
#include<cmath>
using namespace std;
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define sqr(i) ((i)*(i))
#define pii pair<int,int>
#define mp make_pair
#define FOR(i,b,e) for(int i=b;i<=e;i++)
#define ms(a)   memset(a,0,sizeof(a))
const int maxnum =1005;

int n,m;
int dp[2][100005];//第i个fam时
int w[maxnum];
int T,A,S,B,tmp;

int main()
{
//fstream fin("G:/1.txt");
// fin>>T>>A>>S>>B;
scanf("%d%d%d%d",&T,&A,&S,&B);
FOR(i,1,A){
scanf("%d",&tmp);
//fin>>tmp;
w[tmp]++;
}
int sum=0;
ms(dp);
dp[0][0]=dp[1][0]=1;
FOR(i,1,T){
FOR(j,1,B){
dp[i%2][j]=0;
FOR(k,0,w[i]){
if(j<k)continue;
dp[i%2][j]=(dp[i%2][j]+dp[1-i%2][j-k])%1000000;
}
}
}
FOR(i,S,B){
sum = (sum+dp[T%2][i])%1000000;
}
cout<<sum<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 背包问题