dp训练第21题 vijos 1198 最佳课题选择 背包dp-泛化物品

8人阅读 评论(0) 收藏 举报
分类:

背包容量为v(200),物品数为n(20),每个物品给定两个参数Ai(100),Bi(5),表示选择k的体积的该物品需要花费Ai*k^Bi,k为任意正整数.现在要求装满背包,求最小花费.

注意到Bi最大只有5,所以物品最多只有5件了.
每个物品枚举体积1到200,最大值不到1e14,做一下分组背包,这里实际使用的是泛化物品的思想.

把物品从20件变成5件居然wa了??换成20件就过了??

对拍了一下,明白了怎么回事:
本题中bi相同时ai较大的并不一定无用,因为是指数运算,它可以额外选择物品来减少指数增长.
这个事例告诉我们,优化之前一定要确定能否优化!
而且,出现bug时可以还原基础的状态进行调试.

AC代码

/* LittleFall : Hello! */
#include <bits/stdc++.h>
#define ll long long
using namespace std;
inline int read();
inline void write(int x);
const int M = 100016;
ll A[50],B[50]; //save[i]->Ai i->Bi
ll dp[M];
ll power(ll a, ll b)
{
    ll ans = 1;
    while(b)
    {
        if(b & 1)   ans = ans * a;
        a = a * a;
        b >>= 1;
    }
    return ans;
}
int main(void)
{
    #ifdef _LITTLEFALL_
    freopen("in.txt","r",stdin);
    #endif
    //std::cin.sync_with_stdio(false); 

    int v=read(),n=read();
    for(int i=1;i<=n;i++)
        A[i]=read(),B[i]=read();
    for(int i=1;i<=v;i++)
        dp[i]=LLONG_MAX;
    for(int i=1;i<=n;i++)
        for(int j=v;j;j--)
            for(int k=1;k<=j;k++)
                if(dp[j-k]!=LLONG_MAX)
                    dp[j]=min(dp[j],dp[j-k]+A[i]*power(k,B[i]));
    cout << dp[v]<<endl;
    return 0;
}


inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
inline void write(int x)
{
     if(x<0) putchar('-'),x=-x;
     if(x>9) write(x/10);
     putchar(x%10+'0');
}
查看评论

[vijos1198] 最佳课题选择

题目描述Matrix67要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择。由于课题数有限,Matrix67不得不重复选择一些课题。完成不同课题的论文所花的时间不同。具体地说,对于某个课题i,...
  • Bill_Yang_2016
  • Bill_Yang_2016
  • 2017-02-04 15:46:41
  • 136

第八讲 泛化物品

定义 考虑这样一种物品,它并没有固定的费用和价值,而是它的价值随着你分配给它的费用而变化。这就是泛化物品的概念。 更严格的定义之。在背包容量为V的背包问题中,泛化物品是一个定义域为0..V中的整数的函...
  • XerxesSimon
  • XerxesSimon
  • 2016-01-24 11:07:25
  • 768

codeforces 730J (01背包)

题目链接:点击这里题意:给出n个杯子的容量和杯内水的体积,问最少多少个杯子能够装下所有的水,以及在这个杯子数量下最少需要倒多少体积。需要的最少杯子数很好求,按照体积排个序扫一遍就能知道。然后选择某些杯...
  • morejarphone
  • morejarphone
  • 2016-10-25 20:28:37
  • 596

泛化背包问题

简写,笔录,不写太多。    概要:         给出若干物品,对于每个物品的投入x,会得到一个特定回报f(x)         已知总投入为M元,求能得到的最大回报N元。 方程...
  • wodasini
  • wodasini
  • 2016-09-18 23:02:57
  • 541

背包问题-泛化物品

背包问题-泛化物品
  • gxiaop
  • gxiaop
  • 2016-05-30 10:51:54
  • 207

选课(依赖背包dp)

其实就是把背包dp搬树上了, 注意每一个节点必须要先选自己才能选孩子节点 #include #include #include #include #include using namespace ...
  • zhhx2001
  • zhhx2001
  • 2016-08-14 17:47:01
  • 450

背包问题(dp初步)

问题一:0-1背包问题有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值...
  • ccnuacmhdu
  • ccnuacmhdu
  • 2017-08-07 13:59:10
  • 168

51nod1597 有限背包计数问题[DP][分类讨论][前缀和]

有限背包计数问题 SkyDec (命题人) 基准时间限制:2.333 秒 空间限制:131072 KB 分值: 160 你有一个大小为n的背包,你有n种物品,第i种物品的大小为i,且有i个,求装...
  • SindarDawn
  • SindarDawn
  • 2016-10-25 19:00:42
  • 745

01背包 ,完全背包,多重背包 dp (动态规划入门dp)

dp 动态规划,确实难啃, 光 最简单的 背包问题,就 费老大劲. 思想! 思想! 思想!   类似于递推, 局部找 关系.  背包问题,  就两种状态  放还是不放?   其实关于背包放不放的问题,...
  • sizaif
  • sizaif
  • 2017-04-12 22:44:42
  • 1233

C++ 01背包动态规划实现并输出选中物品

本文参考查阅至: 动态规划之01背包问题(最易理解的讲解) 算法设计与分析–01背包问题(动态规划法解决) 关于01背包递归或者动态规划递归或者动态规划循环网上都有很多,但我觉得代码都有些...
  • l773575310
  • l773575310
  • 2017-04-01 12:50:20
  • 1967
    个人资料
    持之以恒
    等级:
    访问量: 6453
    积分: 1331
    排名: 3万+
    文章存档
    最新评论