原文链接: 01背包方案数
上一篇: HDU2161
下一篇: HDU3732
背包方案数
参考
http://blog.csdn.net/wumuzi520/article/details/7021210
GG与无聊的旅游队
http://oj.xjtuacm.com/contest/13/problem/117/
发布时间: 2017年6月30日 22:11 最后更新: 2017年6月30日 22:20 时间限制: 1000ms 内存限制: 128M
描述
GG所在的西交ACM队在参加比赛之余会做一些无聊的题,比如,现在他们想计算,要让一辆校车的载重恰好为G,有多少种装人的方案,由于答案可能很大,只需要对答案 mod(109+7) 即可
ACM队共有N个人,每个人的体重给出为Wi。
1≤N≤1000,1≤Wi≤G≤1000
输入
多组数据,题目第一行给出数据组数T(1≤T≤50),对每组数据
第一行给出N,G
第二行,给出N个数,分别为W1到WN,两个数之间用空格分隔开。
输出
输出一行,为所求的方案数mod(109+7)
样例输入1 复制
3 5 3 3 3 3 3 3 5 8 2 3 3 3 3 5 10 1 2 3 4 5
样例输出1
5 6 3
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
#define MAX 1111
#define LL long long
LL a[MAX];
LL dp[MAX][MAX];
LL mod=1e9+7;
int main(int argc, char *argv[]) {
int T;
scanf("%d", &T);
while (T--) {
int n, g;
scanf("%d%d", &n, &g);
for (int i = 1; i <= n; i++)
scanf("%lld", a + i);
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= g; j++) {
if (j < a[i]) {
dp[i][j] = dp[i - 1][j] % mod;
} else {
dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - a[i]])%mod;
}
}
}
printf("%d\n", dp[n][g]);
}
return 0;
}