hdu5000 背包dp
2015-09-01 17:11
465 查看
题意可抽象为:N个包中每个包容量是T[i],每个包都拿一些,设拿出的总数为sum时的方案数为q,求max(q)
设dp[i][j]为拿了前i个包,共拿出了j物品时的方案数。那么
for i=1 to n
for j=0 to sum
for k=0 to t[i]
dp[i][j]+=dp[i-1][j-k]
但是注意这题中间过程就得取MOD,然而这题求的却是最大值取模而不是取模之后的最大值 【这俩并不一样
可以打表得知dp
[sum{T[i]}/2]是最大值
View Code
设dp[i][j]为拿了前i个包,共拿出了j物品时的方案数。那么
for i=1 to n
for j=0 to sum
for k=0 to t[i]
dp[i][j]+=dp[i-1][j-k]
但是注意这题中间过程就得取MOD,然而这题求的却是最大值取模而不是取模之后的最大值 【这俩并不一样
可以打表得知dp
[sum{T[i]}/2]是最大值
#include <iostream> #include<cstring> #define MOD 1000000007 #define LL long long using namespace std; int N,T; LL sum; int t[2010]; int dp[2010][2010]; int main() { cin>>T; while(T--) { memset(dp,0,sizeof(dp)); sum=0; cin>>N; for(int i=1;i<=N;i++) { cin>>t[i]; sum+=t[i]; } //cout<<sum<<endl; sum=sum/2; //cout<<sum<<endl; for(int i=0;i<=t[1];i++) dp[1][i]=1; for(int i=2;i<=N;i++) for(int j=0;j<=sum;j++) for(int k=0;k<=t[i];k++) if(j>=k) { //cout<<i%2<<" "<<(i-1)%2<<endl; dp[i][j]+=dp[i-1][j-k]; //dp[i][j]+=dp[i-1][j-k] dp[i][j]=dp[i][j]%MOD; } cout<<dp [sum]<<endl; } return 0; }
View Code
相关文章推荐
- [转]七天学会NodeJS
- [推荐] 协同滤波 —— Collaborative Filtering (CF)
- 自己模拟的ftl 用法:
- HDU 4685 Prince and Princess
- iOS CGAffineTransform详解
- java 多线程断点下载
- linux学习基础篇01--硬件基础
- 浏览器兼容方面问题合集
- 跳到系统相册有时会返回Null的地址处理
- Cocos2D-X设计模式:观察者模式
- Android自定义属性的使用
- MFC截屏、绘制并复制到剪切板
- Android内存优化总结
- Android开发亲测error
- 16.IOS 新消息通知提示-声音、震动
- 检查string是否为double
- Handsontable 新增一行 默认值
- IOS第16天(5,Quartz2D雪花)
- 字符串转码
- AngularJS小示例<2>