背包题目-多重背包-二进制优化——洛谷P1776 宝物筛选_NOI导刊2010提高(02)

第一次写背包的题,先献上一波资源
1,看他的关于01背包的代码,其它不用看
2,传说,学背包,不可不看 背包九讲 (太多了,写这篇之前还没看)
3,背包九讲的bilibili的视频
4,01背包的图文解释
这是一道涉及多重背包的问题,先看题目,后面有关于多重背包的理解
题目描述
终于,破解了千年的难题。小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎。但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物。看来小FF只能含泪舍弃其中的一部分宝物了……小FF对洞穴里的宝物进行了整理,他发现每样宝物都有一件或者多件。他粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:小FF有一个最大载重为W的采集车,洞穴里总共有n种宝物,每种宝物的价值为v[i],重量为w[i],每种宝物有m[i]件。小FF希望在采集车不超载的前提下,选择一些宝物装进采集车,使得它们的价值和最大。

输入输出格式
输入格式:

第一行为一个整数N和w,分别表示宝物种数和采集车的最大载重。
接下来n行每行三个整数,其中第i行第一个数表示第i类品价值,第二个整数表示一件该类物品的重量,第三个整数为该类物品数量。
输出格式:

输出仅一个整数ans,表示在采集车不超载的情况下收集的宝物的最大价值。


题目链接

洛谷截图

#include<stdio.h>
#include<string.h>
int f[250000];
int v[250000],w[250000];
int main()
{
 int n,m;
 int t,s,c;
 int i,j,count;
 scanf("%d%d",&n,&m);
 for(i=1,count=0;i<=n;i++)
 {
  scanf("%d%d%d",&t,&s,&c);
  for(j=1;j<=c;j<<=1)
  {
   v[++count]=t*j;
   w[count]=s*j;
   c-=j;
  }
  if(c) {
   v[++count]=t*c;
   w[count]=s*c;
  }
 }
 for(i=1;i<=count;i++)
 {
  for(j=m;j>=1;j--)
  {
   if(w[i]<=j)
   {
    f[j]=f[j] > f[j-w[i]] + v[i] ? f[j] : f[j-w[i]] + v[i];
   }
  }
 }
 printf("%d",f[m]);
 return 0; 
} 

01背包不再赘述,具体内容看上面第一个链接里对01背包的理解
这里说一下对多重背包转化为01背包,前提是你已经理解了什么是01背包,以及01背包的原理,以及如何将01背包空间复杂度降低

多重背包
举个栗子:::
emmmm似乎我对这个东西还不行,去刷题,以后补上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值