• 动态规划之背包模版


    详见大牛背包九讲(下载地址:http://pan.baidu.com/s/1b9edXW)

     1 //Class->物品种类,val->价值,room->所占空间,num->物品数量,Room->背包容量
     2 
     3 #include<stdio.h>
     4 const int maxn = 1e6;
     5 
     6 int bag[maxn];
     7 int Room;
     8 
     9 void zero_one_bag(int,int);         //01背包
    10 void complete_bag(int,int);         //完全背包
    11 void multiple_bag(int,int,int);     //多重背包(二进制优化)
    12 void blendede_bag(int,int,int);     //混合背包
    13 
    14 int main()
    15 {
    16     int Class,val,room,num;
    17     while(~scanf("%d%d",&Class,&Room))
    18     {
    19         /*while(Class--)
    20         {
    21             scanf("%d%d",&val,&room);
    22             //zero_one_bag(val,room);
    23             //complete_bag(val,room);
    24         }
    25         while(Class--)
    26         {
    27             scanf("%d%d%d",&val,&room,&num);
    28             //multiple_bag(val,room,num);
    29             blendede_bag(val,room,num);
    30         }*/
    31         printf("%d
    ",bag[Room]);
    32     }
    33 }
    34 
    35 void zero_one_bag(int val,int room)
    36 {
    37     for(int i=Room; i>=room; --i)
    38     {
    39         int temp = bag[i-room] + val;
    40         if(bag[i] < temp)
    41             bag[i]=temp;
    42     }
    43 }
    44 
    45 void complete_bag(int val,int room)
    46 {
    47     for(int i=room; i<=Room; ++i)
    48     {
    49         int temp = bag[i-room] + val;
    50         if(bag[i] < temp)
    51             bag[i]=temp;
    52     }
    53 }
    54 
    55 void multiple_bag(int val,int room,int num)
    56 {
    57     if(room * num >= Room)//该物品所占总体积大于等于背包容量,相当于完全背包
    58     {
    59         complete_bag(val,room);
    60         return ;
    61     }
    62 
    63     for(int k=1; k<num; k*=2)//该物品所占总体积小于背包容量,二进制优化后相当于01背包
    64     {
    65         zero_one_bag(val*k,room*k);
    66         num-=k;
    67     }
    68     zero_one_bag(val*num,room*num);
    69 }
    70 
    71 void blendede_bag(int val,int room,int num)
    72 {
    73     if(room * num >= Room)//该物品所占总体积大于等于背包容量,相当于完全背包
    74     {
    75         complete_bag(val,room);
    76         return ;
    77     }
    78     else if(num == 1)//该物品数量为1,相当于01背包
    79         zero_one_bag(val,room);
    80     else
    81         multiple_bag(val,room,num);//数量不为1,相当于多重背包
    82 }
  • 相关阅读:
    hdu1881(贪心+dp)
    hdu1513(最长公共子序列)
    关于布局的一点心得
    android字符串工具类
    android系统时间格式转换工具类
    android sp文件一个键值保存多条信息
    android 对话框显示工具类
    android网络连接工具类
    日志打印工具类
    关于项目中的一些经验:封装activity、service的基类,封装数据对象
  • 原文地址:https://www.cnblogs.com/qq188380780/p/6409474.html
Copyright © 2020-2023  润新知