博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu_5800_To My Girlfriend(变种背包)
阅读量:4509 次
发布时间:2019-06-08

本文共 1268 字,大约阅读时间需要 4 分钟。

题目链接:

题意:

给你n和物品和一个重量m,让你求

题解:

To My Girlfriend

令dp[i][j][s1][s2]表示前i个物品填了j的体积,有s1个物品选为为必选,s2个物品选为必不选的方案数(0<=s1,s2<=2),则有转移方程dp[i][j][s1][s2] = dp[i - 1][j][s1][s2] + dp[i - 1][j - a[i]][s1 - 1][s2] + dp[i - 1][j][s1][s2 - 1],边界条件为dp[0][0][0][0] = 1,时间复杂度O(NS*3^2)。

由于顺序可以交换,最后结果要*4

1 #include
2 #define mst(a,b) memset(a,b,sizeof(a)) 3 #define F(i,a,b) for(int i=a;i<=b;++i) 4 using namespace std; 5 typedef long long ll; 6 7 const int N=1011,P=1e9+7; 8 int t,n,s,a[N],dp[N][N][3][3]; 9 10 inline void add(int &a,int b){a+=b;if(a>P)a-=P;}11 12 int main(){13 scanf("%d",&t);14 while(t--)15 {16 scanf("%d%d",&n,&s);17 F(i,1,n)scanf("%d",a+i);18 mst(dp,0),dp[0][0][0][0]=1;19 F(i,1,n)F(j,0,s)F(ii,0,2)F(jj,0,2)20 {21 int *p=&dp[i][j][ii][jj];22 add(*p,dp[i-1][j][ii][jj]);//不塞23 if(j>=a[i])add(*p,dp[i-1][j-a[i]][ii][jj]);//塞24 if(ii>0&&j>=a[i])add(*p,dp[i-1][j-a[i]][ii-1][jj]);//放入必塞25 if(jj>0)add(*p,dp[i-1][j][ii][jj-1]);//放入必不塞26 }27 ll ans=0;28 F(i,1,s)ans=(ans+dp[n][i][2][2])%P;29 printf("%d\n",(ans<<2)%P);30 }31 return 0;32 }
View Code

 

转载于:https://www.cnblogs.com/bin-gege/p/5744223.html

你可能感兴趣的文章
vue 坑
查看>>
js手写call函数
查看>>
Object.prototype.toString.call(obj) 为什么有用以及疑惑点
查看>>
小程序生成二维码,海报
查看>>
.NET Core 原生动态代理
查看>>
.net core 拦截器的使用
查看>>
sqlyog 下载
查看>>
动态WebAPI实现原理
查看>>
ACM-ICPC 2015 Changchun Preliminary Contest——J题
查看>>
CF1214D Treasure Island
查看>>
关于分页的一些前后台知识与应用
查看>>
Visual Studio中的快捷键
查看>>
Mac下显示和隐藏“隐藏文件”
查看>>
Chessboard POJ - 2446(最大流 || 匹配)
查看>>
Warning: Cannot modify header information原因及解决方案
查看>>
Python ConfigParser模块
查看>>
程序员的学习和积累
查看>>
.net实现支付宝在线支付
查看>>
centos7 swoole 三步搞定全部
查看>>
noip2014day1题解
查看>>