#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;//n表示有几个物品,m表示背包能装的空间
int jz[1010],wz[1010];//jz表示物品的价值,wz表示物品所占的空间
int fun(int x1,int y1)//x1表示枚举到第几个物品,是边界,y1表示背包还剩下多少空间,用来确定这个能不能装
{
if(x1>n) return 0;
else if(y1<wz[x1]) return fun(x1+1,y1);//超过重量不能装,只能考虑下一个
else if(y1>=wz[x1])
{
return max(fun(x1+1,y1-wz[x1])+jz[x1],fun(x1+1,y1));
}
}
int main()
{
cin>>n;
cin>>m;
for(int k=1;k<=n;k++)
{
cin>>wz[k]>>jz[k];
}
int res=fun(1,m);
cout<<res;
}
记忆
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;//n表示有几个物品,m表示背包能装的空间
int jz[1010],wz[1010];//jz表示物品的价值,wz表示物品所占的空间
int f[1010][1010];
int fun(int x1,int y1)//x1表示枚举到第几个物品,是边界,y1表示背包还剩下多少空间,用来确定这个能不能装
{
if(f[x1][y1]) return f[x1][y1];
int sum=0;
if(x1>n) sum=0;
else if(y1<wz[x1]) sum=fun(x1+1,y1);
else if(y1>=wz[x1])
{
sum=max(fun(x1+1,y1-wz[x1])+jz[x1],fun(x1+1,y1));
}
f[x1][y1]=sum;
return sum;
}
int main()
{
cin>>m;
cin>>n;
for(int k=1;k<=n;k++)
{
cin>>wz[k]>>jz[k];
}
int res=fun(1,m);
cout<<res;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复