题目描述
多组输入。对于每组输入:
(1 <= n <= 3,1 <= V )接下来的n行,每行三个整数Si,Pi,Mi,分别代表第i种物品的数量,价格与质量()。
输出
对于每组数据,输出一个整数代表答案。
思路:由于V范围太大所以不能用常规的背包来解决这个问题,而种数n很小,最大才是3,所以我就想到了用枚举每种物体放多少件的每种情况来求解该问题的答案。
示例输入
1 10
10 1 10
示例输出
100
DFS做法:
#include <cstdio>
#include <algorithm>
#include <cstring>
#define ll long long
using namespace std;
ll s[5],p[5],m[5],mm,n,V;
void dfs(int x,ll money,ll vum) //x--当前种数,money--上一层已用金额,vum--上一层已占用质量
{
if(x>n) //x大于n说明已枚举完所有n种物品,已到达最底层
{
mm=max(mm,vum); //求此时最大质量
return ;
}
for(int i=0;i<=s[x];i++) //枚举该种物体的件数
{
if((money+i*p[x])<=V)
dfs(x+1,money+i*p[x],vum+i*m[x]); //接着枚举下一种物体
else
return ;
}
}
int main()
{
while(~scanf("%lld %lld",&n,&V))
{
memset(s,0,sizeof(s));
memset(p,0,sizeof(p));
memset(m,0,sizeof(m));
for(int i=1;i<=n;i++)
scanf("%lld %lld %lld",&s[i],&p[i],&m[i]);
mm=0;
dfs(1,0,0);
printf("%lld\n",mm);
}
return 0;
}
普通暴力:
#include <cstdio>
#include <algorithm>
#include <cstring>
#define ll long long
using namespace std;
ll s[5],p[5],m[5],mm,n,V;
void dfs(int x,ll money,ll vum) //x--当前种数,money--上一层已用金额,vum--上一层已占用质量
{
if(x>n) //x大于n说明已枚举完所有n种物品,已到达最底层
{
mm=max(mm,vum); //求此时最大质量
return ;
}
for(int i=0;i<=s[x];i++) //枚举该种物体的件数
{
if((money+i*p[x])<=V)
dfs(x+1,money+i*p[x],vum+i*m[x]); //接着枚举下一种物体
else
return ;
}
}
int main()
{
while(~scanf("%lld %lld",&n,&V))
{
memset(s,0,sizeof(s));
memset(p,0,sizeof(p));
memset(m,0,sizeof(m));
for(int i=1;i<=n;i++)
scanf("%lld %lld %lld",&s[i],&p[i],&m[i]);
mm=0;
dfs(1,0,0);
printf("%lld\n",mm);
}
return 0;
}
#include <cstdio>
#include <algorithm>
#include <cstring>
#define ll long long
using namespace std;
ll s[5],p[5],m[5];
int main()
{
ll n,V;
while(~scanf("%lld %lld",&n,&V))
{
memset(s,0,sizeof(s));
memset(p,0,sizeof(p));
memset(m,0,sizeof(m));
for(int i=1; i<=n; i++)
scanf("%lld %lld %lld",&s[i],&p[i],&m[i]);
ll mm=0;
for(int i=0; i<=s[1]; i++) //n最大是3,最多才循环3层
for(int j=0; j<=s[2]; j++)
for(int k=0; k<=s[3]; k++)
{
if((i*p[1]+j*p[2]+k*p[3])<=V)
mm=max(mm,i*m[1]+j*m[2]+k*m[3]);
}
printf("%lld\n",mm);
}
return 0;
}
#include <cstdio>
#include <algorithm>
#include <cstring>
#define ll long long
using namespace std;
ll s[5],p[5],m[5];
int main()
{
ll n,V;
while(~scanf("%lld %lld",&n,&V))
{
memset(s,0,sizeof(s));
memset(p,0,sizeof(p));
memset(m,0,sizeof(m));
for(int i=1; i<=n; i++)
scanf("%lld %lld %lld",&s[i],&p[i],&m[i]);
ll mm=0;
for(int i=0; i<=s[1]; i++) //n最大是3,最多才循环3层
for(int j=0; j<=s[2]; j++)
for(int k=0; k<=s[3]; k++)
{
if((i*p[1]+j*p[2]+k*p[3])<=V)
mm=max(mm,i*m[1]+j*m[2]+k*m[3]);
}
printf("%lld\n",mm);
}
return 0;
}