解题思路: 动态规划  完全背包 变形 
注意事项:

参考代码:

#include<stdio.h>
#include<string.h>
 long int bj(long int a,long int b)
 { return a<b?a:b;
 }
int main()
{ long int s,i,j,j1,b,ans=0,dans=0,b1,b2,b3,b4,b5;
  long int sn[101];//sn[i]第i种促销种类的物品数 
   long int c[101][7],k[101][7],p[101],xc[7]={0},xp[7]={0},xk[7]={0};
    //促销种类的商品序号,数量,总价 //需求商品序号,单价,数量
   long int dp[6][6][6][6][6];//dp[2][3][4][1][0]代表 当前第 1~5 个物品 分别 购2 3 4 1 0 件所需最少钱 
   long h[6]={0};//h[i] 表示 i 号商品促销数量 
   long sbh[1001]={0};//标号表 链接 促销序号和需买序号的桥梁 
 scanf("%ld",&s);
 for(i=1;i<=s;i++)
 {
 scanf("%ld",&sn[i]);
 for(j=1;j<=sn[i];j++)
  scanf("%ld%ld",&c[i][j],&k[i][j]);
  scanf("%ld",&p[i]);
}
     scanf("%ld",&b);
     for(i=1;i<=b;i++)
 scanf("%ld%ld%ld",&xc[i],&xk[i],&xp[i]);
    for(j=1;j<=b;j++)//初始化需求物品的数量 sbh[i] 代表需求品序号 存 需求数量 
  sbh[xc[j]]=j;
            for(b1=0;b1<=xk[1];b1++)
   for(b2=0;b2<=xk[2];b2++)
     for(b3=0;b3<=xk[3];b3++)
       for(b4=0;b4<=xk[4];b4++)
         for(b5=0;b5<=xk[5];b5++)
                if(b1*xp[1]+b2*xp[2]+b3*xp[3]+b4*xp[4]+b5*xp[5])dp[b1][b2][b3][b4][b5]=b1*xp[1]+b2*xp[2]+b3*xp[3]+b4*xp[4]+b5*xp[5];
 
dp[0][0][0][0][0]=0; //初始化 原价购买 
 
 for(i=1;i<=s;i++)
 {   
     for(j=1;j<=sn[i];j++)
    if(xk[sbh[c[i][j]]]<k[i][j])break;//当前促销品 促销量大于需量 或者 促销品不需要 则不能选择此促销种类 
    if(j<sn[i])continue;
    for(j=1;j<=sn[i];j++)
 h[sbh[c[i][j]]]=k[i][j];
       
  for(b1=h[1];b1<=xk[1];b1++)
   for(b2=h[2];b2<=xk[2];b2++)
     for(b3=h[3];b3<=xk[3];b3++)
       for(b4=h[4];b4<=xk[4];b4++)
         for(b5=h[5];b5<=xk[5];b5++)
 dp[b1][b2][b3][b4][b5]=bj(dp[b1][b2][b3][b4][b5],dp[b1-h[1]][b2-h[2]][b3-h[3]][b4-h[4]][b5-h[5]]+p[i]);
  for(j=1;j<=sn[i];j++)
       h[sbh[c[i][j]]]=0;
 }     
ans=dp[xk[1]][xk[2]][xk[3]][xk[4]][xk[5]];
 printf("%ld\n",ans);
return 0;
}


点赞(5)
 

0.0分

3 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论