01背包与完全背包结合

来源:互联网 发布:macbookair软件推荐 编辑:程序博客网 时间:2024/05/17 03:22

题目:hdu5410

题意:一个物品重量W,告诉你总的物品时数和总钱数。买x个会给a*x+b个蜡烛。问最多可以获得多少个蜡烛。

解答:如果每个物品只拿一个,那就给a+b个蜡烛,所以先01背包再完全背包。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int MAXN = 2020;struct P{    int w,a,b;};P pr[MAXN];int dp[MAXN];int main(){    int T,M,N;    scanf("%d",&T);    while(T--)    {        memset(dp,0,sizeof(dp));        scanf("%d%d",&M,&N);        for(int i = 1;i <= N;i++)            scanf("%d%d%d",&pr[i].w,&pr[i].a,&pr[i].b);        for(int i = 1;i <= N;i++)        {            for(int j = M;j >= pr[i].w;j--)                dp[j] = max(dp[j],dp[j-pr[i].w]+pr[i].a+pr[i].b);            for(int j = pr[i].w;j <= M;j++)                dp[j] = max(dp[j],dp[j-pr[i].w]+pr[i].a);        }        printf("%d\n",dp[M]);    }    return 0;}


Ai × x + 

0 0
原创粉丝点击