背包dp(完全)
Posted showend
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了背包dp(完全)相关的知识,希望对你有一定的参考价值。
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 }
以上是关于背包dp(完全)的主要内容,如果未能解决你的问题,请参考以下文章