[1411] TT要吃肉

来源:互联网 发布:java 调用ant 编辑:程序博客网 时间:2024/05/22 06:11
传送门:http://acm.nbut.cn/Problem/view.xhtml?id=1411
题意:一道基础的混合背包,(本题是01背包与完全背包的混合状态,肉是完全背包,菜是01背包)。
对于背包问题,背包九讲里都有,这里推荐dd大牛的(。。),传送门:http://www.cnblogs.com/jbelial/articles/2116074.html。
所有不详讲背包问题是怎么实现的,但是dd大牛里面有一句话说的很好,复杂的问题都是由简单的问题垒起来的,如此此题当然也是由简单的裸01背包+裸完全背包实现,希望仔细去看下上面的背包九讲(只有伪代码),那么直接给出完整代码:
#include<stdio.h>#include<string.h>int dp[2005], val[2005], we[2005];int max(int a,int b){if(a>b)return a;else return b;}int main(){int v, n, m, i, j;while(~scanf("%d%d%d",&v, &n, &m)){memset(dp, 0, sizeof(dp));for(i = 1;i <= n + m;i++)//n+m个数字代表蔬菜和肉的能量值,前n个为蔬菜{scanf("%d", &val[i]);}for(i = 1;i <= n + m;i++){scanf("%d", &we[i]);//每种食物的体积}for(i = 1; i <= n + m;i++){if(i <= n){for(j = v;j >= 0;j--){if(j >= we[i]){dp[j] = max(dp[j], dp[j - we[i]] + val[i]);}}}else{for(j = 0;j <= v;j++){if(j >= we[i]){dp[j] = max(dp[j], dp[j - we[i]] + val[i]);}}}}int x = dp[0];for(j = v; j >= 0; j--){if(dp[j] > x)x = dp[j];}printf("%d\n",x);}return 0;}


0 0
原创粉丝点击