标签:
现有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
#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); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/became_a_wolf/article/details/48084683