[BZOJ 2287/POJ openjudge1009/Luogu P4141] 消…
2018-06-17 20:54:20来源:未知 阅读 ()
题面:
传送门:http://poj.openjudge.cn/practice/1009/
Solution
DP+DP
首先,我们可以很轻松地求出所有物品都要的情况下的选择方案数,一个简单的满背包DP就好
即:f[i][j]表示前i个物品装满容量为j的背包的方案数.
转移也很简单 f[i][j]=f[i-1][j]+f[i-1][j-w[i]] (i:1~n,j:1~m) (即选和不选的问题)
初始化 f[i][0]=1 (i:[0~n]) (如果背包容量为0,无论如何都有且只有一种方案将其装满)
接下来,考虑用另一个dp来求解在某一物品不放下的方案数
设 g[i][j] 表示第i个物品不放入背包,装满容量为j的背包的方案数
转移为:
g[i][j] = f[n][j] ( j < w[i]) (即当背包容量小于所不放物品的大小时,那么其方案数必然为f[n][j],因为f[n][j]中的所有方案肯定取不到第i个)
= f[n][j] - g[i][j-w[i]]
i:1~n j:1~m
下面那个转移意思即是:
所有的方案总数 减去 包括第i项物品的方案数
因为g[i][j-w[i]]中的每一种情况再装入w[i]即可达到g[i][j]这个状态,而g[i][j]的定义是不装入i的方案数,所以说包括第i项物品的方案能且仅能从g[i][j-w[i]]转移过来
初始化:
g[i][0]=1 (i:[0~n])(背包容量为0时方案有且仅有啥都不要)
这样就可以口头AC了
但是,还有一个要注意的小地方
在%P的意义下, f[n][j]-g[i][j-w[i]]有可能为负数
负数取模的方法为 : (x % P + P)%P
然后就OK啦
Code
//Openjudge 1009:消失之物 //Apr,2ed,2018 //DP+DP #include<iostream> #include<cstdio> using namespace std; long long read() { long long x=0,f=1; char c=getchar(); while(!isdigit(c)){if(c=='-') f=-1;c=getchar();} while(isdigit(c)){x=x*10+c-'0';c=getchar();} return x*f; } const int N=2000+100; const int M=2000+100; const int P=10; char f[N][M],g[M]; int w[N],n,m; int main() { n=read(),m=read(); for(int i=1;i<=n;i++) w[i]=read(); f[0][0]=1; for(int i=1;i<=n;i++) for(int j=0;j<=m;j++) { f[i][j]=f[i-1][j]; if(j-w[i]>=0) f[i][j]+=f[i-1][j-w[i]]; if(f[i][j]>=P) f[i][j]%=P; } g[0]=1; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(j<w[i]) printf("%d",g[j]=f[n][j]); else printf("%d",g[j]=(f[n][j]-g[j-w[i]]+P)%P); } printf("\n"); } return 0; }
后记
这种DP+DP的题目还是第一次写,写起来有一点点不熟练
看来我还是需要多学习一个
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:BZOJ4514: [Sdoi2016]数字配对(费用流)
下一篇:set用法小结
- bzoj3569 DZY Loves Chinese II 2020-05-25
- bzoj4036 [HAOI2015]按位或 2020-04-26
- POJ-3278 2020-04-01
- Asteroids!_poj2225 2020-02-09
- poj-1753题题解思路 2020-01-26
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash