codeforces - 106C 题解

混合背包问题

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<memory.h>
 5 using namespace std;
 6 struct datatype
 7 {
 8     int a;
 9     int b;
10     int c;
11     int d;
12 }data[11];
13 int f[1001];
14 int n,m,c,d;
15 void cal1(int x,int y)
16 {
17     for(int i=n;i>=x;i--)
18     {
19         f[i]=max(f[i],f[i-x]+y);
20     }
21     return;
22 }
23 void cal2(int x,int y)
24 {
25     for(int i=x;i<=n;i++)
26     {
27         f[i]=max(f[i],f[i-x]+y);
28     }
29     return;
30 }
31 void cal3(int x)
32 {
33     int tmp=data[x].a/data[x].b;
34     if(data[x].c*tmp>=n)
35     {
36         cal2(data[x].c,data[x].d);
37         return;
38     }
39     int k=1;
40     while(k<tmp)
41     {
42         cal1(k*data[x].c,k*data[x].d);
43         tmp-=k;
44         k*=2;
45     }
46     cal1(data[x].c*tmp,data[x].d*tmp);
47     return;
48 }
49 int main()
50 {
51     cin>>n>>m>>c>>d;
52     for(int i=1;i<=m;i++)
53     {
54         cin>>data[i].a>>data[i].b>>data[i].c>>data[i].d;
55     }
56     memset(f,0,sizeof(f));
57     for(int i=0;i<=m;i++)
58     {
59         if(i==0)
60         {
61             cal2(c,d);
62         }
63         else
64         {
65             cal3(i);
66         }
67     }
68     int res=0;
69     for(int i=1;i<=n;i++)
70     {
71         res=max(res,f[i]);
72     }
73     cout<<res;
74     return 0;
75 }

 

转载于:https://www.cnblogs.com/shao0099876/p/7365122.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值