第一次写背包的题,先献上一波资源
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似乎我对这个东西还不行,去刷题,以后补上。