读背包九讲之二——完全背包

来源:互联网 发布:淘宝开店怎么上传宝贝图片 编辑:程序博客网 时间:2024/06/01 10:26

没想到完全背包还有如此神奇的写法。学习了。

还了解了和快速求幂类似的二进制思想。

对于为什么完全背包能够这样直接从s[i][1]到v遍历可行并且必须这样,可以从两个层面理解。一是从抽象的概念角度,也就是文章里所说的,对于状态dp[j],由于可能多次取到同一个物品,所以从已经遍历的方向向未遍历的方向遍历是正确的,并且只有以这个方向遍历才是正确的。而是从具体的代码执行流程考虑,假设dp[j]第一次取到了物品i,当j,也就是背包容量增加到j+s[i][1]时,由于可以比较此时的dp[j']与dp[j]+s[i][0],故仍有可能再次取到第i个物品。

实在是妙,太妙了,让我自己是怎么都无法想像还能这样解决完全背包问题,关键是自己习惯并且只会进行形象思维,严密的逻辑思维是在太缺乏了。这种解法所蕴含的思维方式,其实是多么自然多么强大啊。

例题做的poj1384,这里还涉及另一个问题,背包状态的初始化,这里要求背包装满,于是未装满的背包的价值是未定义的,不合理的,于是用-1来标记。具体的处理就是,只有合理的背包才参与选择。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAXN=510,MAXV=10005;int dp[MAXV],s[MAXN][2];int main(){    int T,a,b,n,v;    scanf("%d",&T);    while(T--){        scanf("%d %d",&a,&b);        v=b-a;        dp[0]=0;        for(int i=1;i<=v;i++)            dp[i]=-1;        scanf("%d",&n);        for(int i=1;i<=n;i++)            scanf("%d %d",&s[i][0],&s[i][1]);        for(int i=1;i<=n;i++){            for(int j=s[i][1];j<=v;j++){                if(dp[j-s[i][1]]>=0&&dp[j]>0)                    dp[j]=min(dp[j],dp[j-s[i][1]]+s[i][0]);                else if(dp[j-s[i][1]]>=0)                    dp[j]=dp[j-s[i][1]]+s[i][0];            }        }        if(dp[v]>0)            printf("The minimum amount of money in the piggy-bank is %d.\n",dp[v]);        else            printf("This is impossible.\n");    }    return 0;}


0 0
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 狗让狠狠的打了一顿不理人了怎么办 调好米粉宝宝吃的时候就凉了怎么办 情人间闹分手删了微信后悔了怎么办 8个月宝宝不坐椅子一直要抱怎么办 2个月婴儿3天没有拉大便了怎么办 8个月的宝宝不吃米糊和稀饭怎么办 2岁零5个月的宝宝不说话怎么办 两岁宝宝不拔掉老是拉在裤上怎么办 一岁的宝宝吞了一颗五子棋该怎么办 别人欠我钱还把我拉黑我该怎么办 欠我钱的人耍赖不还我该怎么办 交易猫买的炉石传说号被找回怎么办 淘宝上卖水果过季了不想下架怎么办 两岁宝宝被蚊子咬了挠破流水怎么办 我打了人一拳他就躺地下了怎么办 在微信上被认识的人骗了钱该怎么办 微信上面被不认识的人骗了钱怎么办 柜体和订做的柜门颜色对不上怎么办 拉鞭炮的车压了我的电车不陪怎么办 脚爱出汗穿高跟凉鞋总往前滑怎么办 视频的格式是VⅠD打开很慢怎么办 汕头普法学法我点了考试没考怎么办 德云的生活攻略第三天卡关了怎么办 我的世界房子被参观的人烧了怎么办 新买的手表返厂维修弄划伤了怎么办 糖猫手表丢了别人捡了换了卡怎么办 我妈总怀疑我爸偷她东西怎么办啊 在百度上买的演出票不配送了怎么办 北交大预报名信息填错了怎么办保研 我租了个店面房子但是写了拆怎么办 电话换了微信账号密码都忘了怎么办 宝宝被开水烫了的泡泡破皮了怎么办 脚上泡泡破了的留下的黑印子怎么办 我的车子被前夫霸占了不给我怎么办 自己和同学吵了一架生气了要怎么办 旅游 徐州 泰山 尼泊尔旅游 d\'