2014 UESTC Training for Dynamic Programming M
2014-06-02 12:07
302 查看
分组背包,
s==0 至少取一个。那么通过上一组数所有dp[i-1][j]若要保证至少取一个
那么就需要这一组数据dp[i][j]都是无穷小,那么d[i-1][j-c[k]]+g[k]必然大于dp[i][j]保证了至少取一个
首次取完之后,dp[i][j]=max(dp[i][j],dp[i][j-c[k]]+g[k])在该堆中选择两个以上
s==1 至多取一个。这组的结果由上一组推出,那么对dp[i][x]初始化(x<=T)。
那么dp[i][j]=max(dp[i][j],dp[i-1][j-c[k]]+g[k]);就是选一个或者不选
s==2 随意取,就是01背包。同样依赖与上一组的结果
dp[i][j]=max(dp[i][j],dp[i][j-c[k]]+g[k]);不断更新当前dp[i][x](x<=T)
最终答案就是dp
[T];如果是-1的情况,那么此时的dp
[T]就是-INF;特殊判断一下
s==0 至少取一个。那么通过上一组数所有dp[i-1][j]若要保证至少取一个
那么就需要这一组数据dp[i][j]都是无穷小,那么d[i-1][j-c[k]]+g[k]必然大于dp[i][j]保证了至少取一个
首次取完之后,dp[i][j]=max(dp[i][j],dp[i][j-c[k]]+g[k])在该堆中选择两个以上
s==1 至多取一个。这组的结果由上一组推出,那么对dp[i][x]初始化(x<=T)。
那么dp[i][j]=max(dp[i][j],dp[i-1][j-c[k]]+g[k]);就是选一个或者不选
s==2 随意取,就是01背包。同样依赖与上一组的结果
dp[i][j]=max(dp[i][j],dp[i][j-c[k]]+g[k]);不断更新当前dp[i][x](x<=T)
最终答案就是dp
[T];如果是-1的情况,那么此时的dp
[T]就是-INF;特殊判断一下
#include <map> #include <set> #include <list> #include <cmath> #include<cctype> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cstdio> #include <string> #include <vector> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) { return a % b == 0 ? b : gcd(b, a % b); } #define INF 1e8 int dp[110][110]; int c[102],g[102]; int main() { int N,T; //freopen("sample.txt","r",stdin); while (scanf("%d%d",&N,&T)!=EOF) { memset(dp,0,sizeof(0)); int m,s; for (int i=1;i<=N;i++) { scanf("%d%d",&m,&s); for (int j=0;j<m;j++) scanf("%d%d",&c[j],&g[j]); if (s==0) //至少选一个 { for (int j=0;j<=T;j++) dp[i][j]=-INF; for (int k=0;k<m;k++) for (int j=T;j>=c[k];j--) { dp[i][j]=max(dp[i][j],max(dp[i-1][j-c[k]]+g[k],dp[i][j-c[k]]+g[k]));//不选择,首次选择,非首次选择 } } else if (s==1)//至多选一个 { for (int j=0;j<=T;j++) dp[i][j]=dp[i-1][j]; for (int k=0;k<m;k++) for (int j=T;j>=c[k];j--) { dp[i][j]=max(dp[i][j],dp[i-1][j-c[k]]+g[k]); } } else if (s==2) { for (int j=0;j<=T;j++) dp[i][j]=dp[i-1][j]; for (int k=0;k<m;k++) for (int j=T;j>=c[k];j--) { dp[i][j]=max(dp[i][j],dp[i][j-c[k]]+g[k]); } } } //printf("%d\n",INF); //printf("%d\n",dp [T]); //printf("%d\n",dp[N+1][T]); //if (dp [T]==dp [T-1]){printf("-1\n");continue;} //else printf("%d\n",dp [T]); dp [T]=max(-1,dp [T]); printf("%d\n",dp [T]); } return 0; }
相关文章推荐
- 2014 UESTC Training for Dynamic Programming
- 2014 UESTC Training for Dynamic Programming F
- 2014 UESTC Training for Dynamic Programming G
- 2014 UESTC Training for Dynamic Programming I
- 2014 UESTC Training for Dynamic Programming J
- 2014 UESTC Training for Dynamic Programming L
- 2016 UESTC Training for Dynamic Programming D - 柱爷的恋爱 区间dp、记忆化搜索
- UESTC_男神的礼物 2015 UESTC Training for Dynamic Programming<Problem A>
- UESTC_秋实大哥掰手指 2015 UESTC Training for Dynamic Programming<Problem B>
- 2017 UESTC Training for Dynamic Programming
- 2016 UESTC Training for Dynamic Programming F - 柱爷与三叉戟不得不说的故事 压位dp
- UESTC_酱神赏花 2015 UESTC Training for Dynamic Programming<Problem C>
- 2015 UESTC Training for Dynamic Programming J - 男神的约会(bfs)
- UESTC_最少花费 2015 UESTC Training for Dynamic Programming<Problem D>
- 2016 UESTC Training for Dynamic Programming H - 柱爷大战滑稽王 LCS转LIS
- 2015 UESTC Training for Dynamic Programming H - 邱老师选妹子(数位dp)
- UESTC_菲波拉契数制 2015 UESTC Training for Dynamic Programming<Problem E>
- 2015 UESTC Training for Dynamic Programming 男神的礼物(区间dp)
- UESTC_邱老师看电影 2015 UESTC Training for Dynamic Programming<Problem F>
- 2016 UESTC Training for Dynamic Programming J - 柱爷抢银行II dp单调队列优化