![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
链接: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体积的方案数分别为:11222333 备注: 不要忘记取模!!!n,m,vi <= 50000
完全背包,讲真我还是不怎么理解,最主要的是dp[j]=dp[j]+dp[j-w[i]]。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#include <iostream> #include <cstdio> #include <cstring> #define MAXN 50010 #define mod %19260817 using namespace std; int dp[MAXN],a[MAXN]; int W,n,x,ans; int solve(int n,int W) { memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=1;i<=n;i++) { for(int j=a[i];j<=W;j++) { dp[j]=dp[j]+dp[j-a[i]]; if(dp[j]>19260817) dp[j]-=19260817; } } for(int i=1;i<=W;i++) { ans=ans+dp[i]; if(ans>19260817) ans-=19260817; } return ans; } int main() { scanf("%d%d",&n,&W); for(int i=1;i<=n;i++) scanf("%d",&a[i]); printf("%d\n",solve(n,W)); return 0; }