正题
题目大意
nnn个物品,用空间换价值。mmm个方式,用价钱换空间。
要求价值超过p的情况下价钱最低。
解题思路
先算出超过ppp至少要多少空间。然后在算出这个空间至少需要多少价钱。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1200,M=51010;
int w1[N],v1[N],x[N],y[N],z[N],f2[N][M],f1[M];
int cnt1,cnt2,n,m,p,test,ans,mic;
int main()
{//freopen("data.in","r",stdin);//freopen("data.out","w",stdout);scanf("%d",&test);while(test--){memset(f1,0x3f,sizeof(f1));memset(f2,0,sizeof(f2));cnt1=0;cnt2=0;scanf("%d%d%d",&n,&m,&p);for(int i=1;i<=n;i++){int t,u,v;scanf("%d%d%d",&t,&u,&v);for(int i=1;i<=v;i*=2){v-=i;w1[++cnt1]=u*i;v1[cnt1]=t*i;}if(v) w1[++cnt1]=u*v,v1[cnt1]=t*v;}f1[0]=0;ans=2147483647;for(int i=1;i<=cnt1;i++)for(int j=p+100;j>=v1[i];j--){f1[j]=min(f1[j],f1[j-v1[i]]+w1[i]);if(j>=p) ans=min(ans,f1[j]);}if(ans==2147483647){printf("TAT\n");continue;}for(int i=1;i<=m;i++)scanf("%d%d%d",&x[i],&y[i],&z[i]);mic=2147483647;for(int i=1;i<=m;i++)for(int j=0;j<=z[i];j++)for(int k=1;k<=M-10;k++)if(j*y[i]<=k){f2[i][k]=max(f2[i-1][k-j*y[i]]+j*x[i],f2[i][k]);if(f2[i][k]>=ans){mic=min(mic,k);break;}}if(mic==2147483647){printf("TAT\n");continue;}printf("%d\n",mic);}
}