洛谷 P1964 【mc生存】卖东西

题目描述

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 }
代码看这里!

猜你喜欢

转载自www.cnblogs.com/boken/p/9478078.html