01背包方案数

原文链接: 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值