cf 543A 完全背包

http://blog.csdn.net/slowlight93/article/details/45578197原文连接

cf 543Ahttp://codeforces.com/problemset/problem/543/A

首先考虑最直接的三维方程 

dp(i, j, k) 表示前i个程序员写了j行代码bug不超过k 
dp(i,j,k)=dp(i1,jr,kra[i]),ir  
我们可以换种视角优化这个方程 
1)第i个程序员没写代码 
2)第i个程序员写了至少一行 
dp(i,j,k)=dp(i1,j,k)+dp(i,j1,ka[i])  
这个方程在时间复杂度上已经是O(n^3)了 
如果我们在储存的时候省掉第一维 
那么在枚举到 (i, j, k)这个状态的时候实际储存的是 (i-1, j, k) 
那么 

dp(j, k) = dp(j, k) + dp(j-1, k-a[i]) 

最后附上代码

#include <algorithm>
#include <cstdio>
#include <iostream>
using namespace std;
int a[501];
int dp[501][501];
int main(void)
{
//freopen("in.txt","r",stdin);
int n,m,b,mod;
cin >> n >> m >> b >> mod;
for(int i = 1;i<=n;i++)
scanf("%d",&a[i]);
dp[0][0]=1;
int x =0;
for(int i = 1;i<=n;i++)
{
for(int j=1;j<=m;j++)
for(int t=a[i];t<=b;t++)
dp[j][t]=(dp[j][t]+dp[j-1][t-a[i]])%mod;
}
for(int i = 0;i<=b;i++)
x=(dp[m][i]+x)%mod;
cout << x << endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值