hdu 5000 dp **
2015-09-05 15:23
357 查看
题目中提到 It guarantees that the sum of T[i] in each test case is no more than 2000 and 1 <= T[i].
加上一堆顺序,基本可以猜到是属于递推形的dp
dp[i][j]表示前i个和为j时的方案数
dp方程: dp[i][j]+=dp[i][j-k]
加上一堆顺序,基本可以猜到是属于递推形的dp
dp[i][j]表示前i个和为j时的方案数
dp方程: dp[i][j]+=dp[i][j-k]
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> using namespace std; #define MOD 1000000007 const int INF=0x3f3f3f3f; const double eps=1e-5; typedef long long ll; #define cl(a) memset(a,0,sizeof(a)) #define ts printf("*****\n"); const int MAXN=2005; int n,m,tt; int a[MAXN]; int dp[MAXN][MAXN]; int main() { int i,j,k,ca=1; #ifndef ONLINE_JUDGE freopen("1.in","r",stdin); #endif scanf("%d",&tt); while(tt--) { scanf("%d",&n); int sum=0; for(i=0;i<n;i++) { scanf("%d",a+i); sum+=a[i]; } cl(dp); for(i=0;i<=a[0];i++) { dp[0][i]=1; } for(i=1;i<n;i++) { for(j=0;j<=sum/2;j++) { for(k=0;k<=a[i];k++) { if(j-k<0) break; dp[i][j]+=dp[i-1][j-k]; dp[i][j]%=MOD; } } } printf("%d\n",dp[n-1][sum/2]); } }
相关文章推荐
- iphone开发之音频播放类AVAudioPlayer的使用——加纯代码案例
- Eclipse快捷键
- Eclipse快捷键
- grub的简单应用与配置
- jQuery——index()的用法分析
- 关于自己制作的软件被杀毒软件误报的解决办法
- 旋转四元数的理解-凌乱总结
- 二叉树的各种操作
- hdu1506(dp减少重复计算)
- IOS学习笔记1—Iphone程序运行流程
- 关于self.window.rootViewController的方法调用顺序
- 排序算法及其复杂度(JavaScript实现)
- Android 运行中效验文件完整合法性
- 如何减小在VS2013下生的exe文件的大小.
- Hive 1.1.1 启动错误
- Service绑定服务
- deque及迭代器失效问题
- 笔试真题解析 TT 研发工程师笔试卷
- effective c++ 尽量以const enum inline 替换 #define
- C语言怎么将用户账号密码写入文件实现登录注册功能?