任务描述
又快到了寒假时间,说到寒假,免不了出去玩耍,小蒋今天要去郊游,她想带点零食去,但是她的包包大小有限,所以她需要在n
个零食中挑选若干零食装入包包,最多能装多满?假设包包的大小为m
,每袋零食的大小为A[i]
。
样例
如果有4
个零食大小是[2, 3, 5, 7]
。 如果包包的大小为11
,可以选择[2, 3, 5]
装入背包,最多可以装满10
的空间。 如果包包的大小为12
,可以选择[2, 3, 7]
装入背包,最多可以装满12
的空间。
测试说明
平台会对你编写的代码进行测试:
测试输入: 11
2 3 5 7
预期输出: 10
开始你的任务吧,祝你成功!
这是一道很简单的背包问题,比最简单的01背包还要简单,因为没有价格的存在,再看完网上的关于01背包之后,这道题就很简单:
01背包最关键的问题就是,v[]表示体积,jia表示单价,f表示目前总价
比较没有装入这一个东西VS装入了这个东西之后,哪一个的价值更大
当(此刻的总容量 j >jia[i]的价格的时候)//如果总容积都小于这一样东西,想都别想装下!!
{
f[i-1][j] (就是上一层的价值)//还未考虑当前物品的价值
和 f[ i-1 ][ j-v[ i ] ]+ jia [ i ] (得到除去本东西体积的价格后,加上本样东西的价格) ,谁大选谁,
}
由此,每一样东西都遍历一次
#include<algorithm>
#include<iostream>
#include<sstream>
#define int long long
using namespace std;
typedef long long ll;
const int N = 2000;
int a[N + 10];
int f[10000][10000]={0};
int32_t main()
{
int p,n=0;
int k;
cin>>k;
for(p=1;;p++)
{
cin>>a[p];
n++; //计算输入个数
if(getchar()=='\n')break; //遇回车中断
}
//printf("%d",n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=k;j++)
{
f[i][j]=f[i-1][j];
if(j>=a[i])
{
f[i][j]=max(f[i-1][j-a[i]]+a[i],f[i][j]);
//printf("f[%d][%d]=%d\n",i,j,f[i][j]);
}
}
}
cout<<f[n][k];
}
/printf("f[%d][%d]=%d\n",i,j,f[i][j]);
可以使用这一段代码,来看表格内的值