来发背包开开胃
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
现有n种商品,每种商品有Si件,每种商品的价格和质量分别为Pi和Mi。你现在有钱V,问能购买的商品的总质量最大为多少。
输入
多组输入。 对于每组输入:
第一行两个整数n,V(1 <= n <= 3,1 <= V <= 1,000,000,000)。
接下来的n行,每行三个整数Si,Pi,Mi,分别代表第i种物品的数量,价格与质量(1 <= Si <= 100,1 <= Pi <= 1,000,000,000 , 1 <= Mi <= 1,000,000,000)。
输出
对于每组数据,输出一个整数代表答案。
示例输入
1 1010 1 10
示例输出
100
提示
此题数太大,不能用背包dp[10000000...],就算用map,也会因为从0初始化化到10亿而超时;
但数量少,可暴力,可DFS..
但数量少,可暴力,可DFS..
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
int n;
long long v,sum=-1,ans,s[4],m[5],p[5];
while(~scanf("%d%lld",&n,&v))
{
sum=-1;
memset(s,0,sizeof(s));
memset(p,0,sizeof(p));
memset(m,0,sizeof(m));
for(int i=0;i<n;i++)
scanf("%lld%lld%lld",&s[i],&p[i],&m[i]);
for(int i=0;i<=s[0];i++) //暴力模拟背包
for(int j=0;j<=s[1];j++)
for(int k=0;k<=s[2];k++)
{
if(v<i*p[0]+j*p[1]+p[2]*k)
continue;
ans=i*m[0]+j*m[1]+m[2]*k;
if(sum<ans)
sum=ans;
}
printf("%lld\n",sum);
}
}
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long int n,v;
long long sum=-1;
long long int m[1000],p[1000],s[1000];
int vis[5],tt=0;
int DFS(int i,long long int v,long long int ans,int num)
{
if(v<0)
return 0;
if(i>n) //种类
return 0;
if(num>tt) //个数不能超过总个数
return 0;
if(ans>sum)
{
sum=ans;
return 0;
}
for(int j=0; j<=s[i]; j++)
{
if(v-p[i]*j>=0)
{
DFS(i+1,v-p[i]*j,ans+m[i]*j,num+j);
}
}
}
int main()
{
while(~scanf("%lld%lld",&n,&v))
{
tt=0;
for(int i=0; i<n; i++)
{
scanf("%lld%lld%lld",&s[i],&p[i],&m[i]);
tt+=s[i];
}
memset(vis,0,sizeof(vis));
sum=0;
DFS(0,v,0,0);
printf("%lld\n",sum);
}
}