1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 using namespace std; 5 const int b=6;//进制 6 int B[15]; 7 int mapp[1010];// id 映射 8 int val[200];// 价值 9 int cost[200];// 花费 10 int dp[66666];//状态下的最小花费 11 int n,m,goal;// goal 最终的状态 12 bool cmp (int x,int y) { 13 for (int i=0;i<n;i++) { 14 int tx=x%b; 15 int ty=y%b; 16 if (tx<ty) return false; 17 x/=b; 18 y/=b; 19 } 20 return true; 21 } 22 int main () 23 { 24 ios::sync_with_stdio(false); 25 B[0]=1; 26 for (int i=1;i<=10;i++) B[i]=B[i-1]*b; 27 cin>>n; 28 for (int i=0;i<n;i++) {// 单价也看做是一种更新方案 29 int id,num; 30 cin>>id>>num>>val[i]; 31 mapp[id]=i; 32 cost[i]=B[i];// i 从0开始 33 goal+=cost[i]*num; 34 } 35 cin>>m; 36 for (int i=n;i<n+m;i++) { 37 int t; cin>>t; 38 int state=0; 39 for (int j=1;j<=t;j++) { 40 int id,num; 41 cin>>id>>num; 42 state+=cost[mapp[id]]*num; 43 } 44 cost[i]=state;// 优惠方案的cost 45 cin>>val[i]; 46 } 47 memset (dp,0x3f,sizeof(dp)); dp[0]=0; 48 for (int i=0;i<n+m;i++) 49 for (int j=cost[i];j<=goal;j++) { 50 if (cmp (j,cost[i]))// 更新的时候 判断各个物品是否大于cost[i](能否更新) 51 dp[j]=min (dp[j],dp[j-cost[i]]+val[i]); 52 } 53 cout<<dp[goal]<<endl; 54 return 0; 55 }