时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
小k有一个三轮,它最多可以装105大小的东西
小k有n种商品,他要准备出摊了
每种商品体积为vi,都有105件
输出凑成1~m的体积的总方案数
输出可能会很大,请对大质数19260817取模
输入描述:
第一行两个整数n,m, 接下来n行,每行一个数代表vi
输出描述:
一个数ans表示总方案数
示例1
输入
复制
2 8 1 3
输出
复制
17
说明
从1~m体积的方案数分别为: 1 1 2 2 2 3 3 3
备注:
不要忘记取模!!! n,m,vi <= 50000
思路:
虽然题目给了商品件数的限制,但是太大,不可能取到超过限制的商品,所以就转化成了完全背包问题。
long long 会超时,int不会。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 50005
#define mod 19260817
int n,m,a[MAXN];
int dp[MAXN];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",a+i);
dp[0]=1;
for(int i=1;i<=n;i++)
{
for(int j=a[i];j<=m;j++)
{
dp[j]=(dp[j]+dp[j-a[i]])%mod;
}
}
int ans=0;
for(int i=1;i<=m;i++)
ans=(ans+dp[i])%mod;
printf("%d\n",ans);
return 0;
}