码迷,mamicode.com
首页 > 其他好文 > 详细

背包dp(完全)

时间:2020-07-05 00:49:16      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:for   opened   spl   def   sign   sig   display   names   signed   

http://poj.org/problem?id=3181

高精+背包

完全背包求方案数则只需dp[ j ] + = dp[ j - w[ i ] ]即可;任意一种背包方案计算都只需将max变为+;

这道题要注意,求方案数一般有很多,不mod,就自己看看数据是否超内存;

dp[ i ]存放前18位;dp[ i ]存放后18位;

对于前18位 dp[ j ]= dp[ j ] + dp [ j-w[ i ] ] + ( dp1[ j ]+dp1[ j-w[ i ] ) / inf

 前18位相加,在加上后18位相加时产生的进位;

技术图片
 1 #include<iostream>
 2 #include<string.h>
 3 using namespace std;
 4 #define int long long
 5 const int maxn=1100;
 6 __int64 inf=1;
 7 int dp[maxn],dp1[maxn];
 8 signed main()
 9 {
10     int n,k;
11     cin>>n>>k;
12     memset(dp,0,sizeof(dp));
13     memset(dp1,0,sizeof(dp1));
14     for (int i=0; i<18; i++)    inf *= 10;
15     dp1[0]=1;
16     for(int i=1;i<=k;i++)
17     {
18         for(int j=i;j<=n;j++)
19         {
20             dp[j]=dp[j]+dp[j-i]+(dp1[j]+dp1[j-i])/inf;
21             dp1[j]=(dp1[j]+dp1[j-i])%inf;
22         }
23     }
24    if(dp[n]) cout<<dp[n];
25     cout<<dp1[n]<<endl;
26 }
View Code

 

背包dp(完全)

标签:for   opened   spl   def   sign   sig   display   names   signed   

原文地址:https://www.cnblogs.com/Showend/p/13237217.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!