简单dp

链接:https://www.nowcoder.com/acm/contest/157/F
来源:牛客网
 

小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

分析:类似一个背包题,显然这题用dp做,可得状态转移方程为dp[j]+=dp[j-a[i]],dp[j]表示求体积为j时的方案数,考虑每个物品对答案的贡献,就是每次都加上最后取体积为a[i]的物品的方案数,最后把体积为1~m的方案数加起来就可以了

AC code:

#include
using namespace std;
const int maxn=100005;
typedef long long ll;
const ll mod=19260817;
ll dp[maxn];
ll a[maxn];
int main()
{
    int n,m;
    cin>>n>>m;
    memset(dp,0,sizeof dp);
    for(int i=1;i<=n;i++)
        cin>>a[i];
    dp[0]=1;
    for(int i=1;i<=n;i++)
        for(int j=a[i];j<=m;j++)       ///当考虑第i件物品对答案的贡献时
          dp[j]=(dp[j]+dp[j-a[i]])%mod;///dp[j]表示当体积为j时的方案数,最后一件物品选a[i]
    ll ans=0;
    for(int i=1;i<=m;i++)
        ans=(ans+dp[i])%mod;
    cout<

 

你可能感兴趣的:(简单dp)