tzoj_购买食品
描述
crq去超市购买食品,他只关注食品的钙和蛋白质两个成分,现在他挑了n件食品,也得到了每件食品的钙和蛋白质含量,但他不想买太多,因此希望选取最少的食品数量,并期望食品的钙和蛋白质总量达到预期的值。
输入
第一行为n,接下来n行表示有n件食品,每件食品在一行中给出了钙和蛋白质的含量。
最后一行为x和y,表示crq预期的钙和蛋白质总量。
所有整数不超过300。
输出
如果能达到期望的结果,则输出最少的食品数量,否则输出Sorry
样例输入
3
2 1
3 4
2 3
5 6
样例输出
2
提示
可以选择第2和3件食品,得到的钙和蛋白质含量和分别为5和7,达到预期。
下面是代码
#include<bits/stdc++.h>
using namespace std;
int a[1000],b[1000],dp[1000][1000];//a数组记录钙,b数组记录蛋白质,动态数组dp[i][j]表示到达预期i数量钙和预期j数量蛋白质最少需要买几件物品
int main()
{
memset(f,0x3f,sizeof(f));
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i]>>b[i];
}
int w1,w2;
f[0][0]=0;//特殊条件初始化一下
cin>>w1>>w2;
for(int i=0;i<n;i++)
for(int k=311;k>=a[i];k--)
for(int j=311;j>=b[i];j--)
{
dp[k][j]=min(dp[k][j],dp[k-a[i]][j-b[i]]+1);//每个都有带这件物品和不带这件物品两种状态,取最小就好了
}
int res=301;
for(int k=w1;k<=w1+300;k++)
for(int j=w2;j<=w2+300;j++)
res=min(res,dp[k][j]);
if(res==301)
cout<<"Sorry"<<endl;
else
cout<<res<<endl;
}