poj 3046 分组背包
2015-10-14 21:46
429 查看
分组背包问题在于如何将问题看作分组。
一旦弄清了 分组 和 背包 就可以直接套模板
第一个循环 分组循环
第二个循环 背包循环
第三个循环 分组内循环
一旦弄清了 分组 和 背包 就可以直接套模板
第一个循环 分组循环
第二个循环 背包循环
第三个循环 分组内循环
#include<iostream> #include <string> #include<vector> #include<algorithm> #include<set> #include<fstream> #include<cmath> using namespace std; #define lch(i) ((i)<<1) #define rch(i) ((i)<<1|1) #define sqr(i) ((i)*(i)) #define pii pair<int,int> #define mp make_pair #define FOR(i,b,e) for(int i=b;i<=e;i++) #define ms(a) memset(a,0,sizeof(a)) const int maxnum =1005; int n,m; int dp[2][100005];//第i个fam时 int w[maxnum]; int T,A,S,B,tmp; int main() { //fstream fin("G:/1.txt"); // fin>>T>>A>>S>>B; scanf("%d%d%d%d",&T,&A,&S,&B); FOR(i,1,A){ scanf("%d",&tmp); //fin>>tmp; w[tmp]++; } int sum=0; ms(dp); dp[0][0]=dp[1][0]=1; FOR(i,1,T){ FOR(j,1,B){ dp[i%2][j]=0; FOR(k,0,w[i]){ if(j<k)continue; dp[i%2][j]=(dp[i%2][j]+dp[1-i%2][j-k])%1000000; } } } FOR(i,S,B){ sum = (sum+dp[T%2][i])%1000000; } cout<<sum<<endl; return 0; }
相关文章推荐
- C#使用回溯法解决背包问题实例分析
- 关于背包问题的一些理解和应用
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 背包问题
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- 用单调栈解决最大连续矩形面积问题
- 2632 Crashing Robots的解决方法