分组背包问题在于如何将问题看作分组。
一旦弄清了 分组 和 背包 就可以直接套模板
第一个循环 分组循环
第二个循环 背包循环
第三个循环 分组内循环
#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;
}