三重背包

来源:互联网 发布:淘宝无法查询物流信息 编辑:程序博客网 时间:2024/04/29 04:39

题目:

hdoj:http://acm.hdu.edu.cn/showproblem.php?pid=4501

思路:

本题有三个容量条件:钱,积分,免费物品。所以要考虑的情况就有很多种,于是要用三重背包来解这个题。

AC代码:

#include<stdio.h>#include<string.h>#define M 110int dp[M][M][M];int max(int a, int b){return a > b? a : b;}int maxn(int a, int b, int c, int d){return max(max(a, b), max(c, d));}main(){int n, v1, v2, k, s1[M], s2[M], s3[M];while(scanf("%d %d %d %d", &n, &v1, &v2, &k) != EOF){memset(dp, 0, sizeof(dp));int cnt = 0, sum = 0;for(int i = 0; i < n; i++){int a, b, c;scanf("%d %d %d", &a, &b, &c);if(a == 0 || b == 0)sum += c;else{s1[cnt] = a, s2[cnt] = b, s3[cnt] = c;cnt++;}}for(int i = 0; i < cnt; i++)for(int j = v1; j >= 0; j--)for(int p = v2; p >= 0; p--)for(int l = k; l >= 0; l--)//三重背包需要4个循环,分别是三个容量和一个物品循环,并取三种状态与初始状态中的最大值{int tmp1 = 0, tmp2 = 0, tmp3 = 0;if(j >= s1[i])tmp1 = dp[j - s1[i]][p][l] + s3[i];if(p >= s2[i])tmp2 = dp[j][p - s2[i]][l] + s3[i];if(l > 0)tmp3 = dp[j][p][l - 1] + s3[i];dp[j][p][l] = maxn(tmp1, tmp2, tmp3, dp[j][p][l]);}printf("%d\n", dp[v1][v2][k] + sum);}}


0 0
原创粉丝点击