• poj-1170 (状态压缩形式下的完全背包)


     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstring>
     4 using namespace std;
     5 const int b=6;//进制
     6 int B[15];
     7 int mapp[1010];// id 映射
     8 int val[200];// 价值
     9 int cost[200];// 花费
    10 int dp[66666];//状态下的最小花费
    11 int n,m,goal;// goal 最终的状态
    12 bool cmp (int x,int y) {
    13     for (int i=0;i<n;i++) {
    14         int tx=x%b;
    15         int ty=y%b;
    16         if (tx<ty)  return false;
    17         x/=b;
    18         y/=b;
    19     }
    20     return true;
    21 }
    22 int main ()
    23 {
    24     ios::sync_with_stdio(false);
    25     B[0]=1;
    26     for (int i=1;i<=10;i++) B[i]=B[i-1]*b;
    27     cin>>n;
    28     for (int i=0;i<n;i++) {// 单价也看做是一种更新方案
    29         int id,num;
    30         cin>>id>>num>>val[i];
    31         mapp[id]=i;
    32         cost[i]=B[i];// i 从0开始
    33         goal+=cost[i]*num;
    34     }
    35     cin>>m; 
    36     for (int i=n;i<n+m;i++) {
    37         int t; cin>>t;
    38         int state=0;
    39         for (int j=1;j<=t;j++) {
    40             int id,num;
    41             cin>>id>>num;
    42             state+=cost[mapp[id]]*num;
    43         }
    44         cost[i]=state;// 优惠方案的cost 
    45         cin>>val[i];
    46     }
    47     memset (dp,0x3f,sizeof(dp)); dp[0]=0;
    48     for (int i=0;i<n+m;i++) 
    49         for (int j=cost[i];j<=goal;j++) {
    50             if (cmp (j,cost[i]))// 更新的时候 判断各个物品是否大于cost[i](能否更新)
    51                 dp[j]=min (dp[j],dp[j-cost[i]]+val[i]);
    52         }
    53     cout<<dp[goal]<<endl;
    54     return 0;
    55 }
    抓住青春的尾巴。。。
  • 相关阅读:
    。net文件缓存 枫
    C#实现冒泡排序 堆栈 队列 枫
    Android程序开发初级教程(三) 枫
    c#语法片段总结 枫
    Eclipse快捷键大全(转载) 枫
    asp.net页面缓存技术(Cache、XML) 枫
    android案例 枫
    DIV CSS兼容性解决IE6/IE7/FF浏览器的通用方法完美兼容 枫
    List<>.Contains<>的用法 枫
    sql 获取表结构信息(2005) 枫
  • 原文地址:https://www.cnblogs.com/xidian-mao/p/8472848.html
Copyright © 2020-2023  润新知