题目描述
lcy0x1去服务器的系统商店卖东西。
一个人的背包有21格。
一开始他的背包里有m件不同的物品(不能卖)。
他要卖n种物品,每种物品有ai件,价值bi,一格可以放ci个,
名字sti(0<sti的长度<100)
相同的物品可以放同一格(只要没放满)。
问他跑一次最多能卖多少钱。
输入输出格式
输入格式:第一行m,n(0<=m<=21,0<=n<=100);
下面n行 ai,bi,ci,sti(0<=ai<=1344,0<=bi<=10000,0<ci<=64);
输出格式:最多卖的钱s(0<=s<=1000000);
输入输出样例
输入样例#1:
20 3 63 1 64 yinshifen 1 10 1 men 1 1 64 yinshifen
输出样例#1:
64
说明
多重背包
搜索0分!!!
强大的数据
数据也很小,所以不用DP,就小小的处理下,排下序就可以过了
1 #include<bits/stdc++.h> //万能头文件 2 using namespace std; 3 int n,m; 4 struct data{ //结构体大法 5 int a,b,c; 6 string name; 7 }d[2000]; 8 void in() 9 { 10 cin>>m>>n; m=21-m; //m为剩余格子数 11 for(int i=1; i<=n; i++) 12 cin>>d[i].a>>d[i].b>>d[i].c>>d[i].name; //读入数据 13 } 14 void merge() //合并 15 { 16 for(int i=1; i<n; i++) 17 for(int k=i+1; k<=n; k++) 18 if(d[i].name==d[k].name) //如果是同一种类型 19 { 20 if(d[i].a+d[k].a>d[i].c){ //数量超标 21 d[k].a+=d[i].a; d[k].a-=d[i].c; //能合并的合并 22 d[i].a=d[i].c; 23 } 24 else{ //数量不超标 25 d[i].a+=d[k].a; //直接合并不解释 26 d[k].a=0; 27 } 28 } 29 } 30 void sortq() 31 { 32 for(int i=1; i<=n; i++) //小小的冒泡,排出最佳 33 for(int k=i+1; k<=n; k++) 34 if(d[i].b<d[k].b){ 35 d[0]=d[i]; 36 d[i]=d[k]; 37 d[k]=d[0]; 38 } 39 } 40 void zcx() 41 { 42 for(int i=1; i<=n; i++) d[i].b*=d[i].a; //价值算出来! 43 sortq(); 44 int i=1,ans=0; 45 while(m--) ans+=d[i++].b; //一个while解决ans 46 cout<<ans<<endl; //输出不解释 47 } 48 int main() //多么清爽的主程序!(划掉) 49 { 50 in(); 51 merge(); 52 zcx(); 53 return 0; 54 }