不是VIP会员,不能显示答案

题目解答

题目:
【布置新房】(3+3+3+3+3=15分)
笑笑今天很开心,家里购置的新房领到钥匙了,新房里有一间笑笑自己专用的很宽敞的房间。更让她高兴的是,妈妈昨天对她说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过m元钱就行”。笑笑怀里揣着m元RMB到了商场,商场里的物品真多啊,让人眼花缭乱。笑笑想买的东西很多,于是,她把想买的每件物品规定了一个重要度,用整数表示,数值越大越重要,当然每件物品都有价格,笑笑经过仔细观察,发现这个商场很奇特,所有物品的价格都是整数。笑笑希望在不超过m元(可以等于m元)的前提下,买回去布置新房的物品的重要度之和最大。
比如想买有4件物品,价格分别为3,4,5,8,对应的重要度分别为4,5,7,10,笑笑总共有12元钱,则取编号为1,2,3的物品,得到最大的重要度之和为16。
Input
第一行为m和n,中间用空格隔开,表示m元RMB和商场中有n件物品。
下面n行依次为每件物品的价格和重要度,中间用一个空格隔开。
Output
一行,表示在不超过m元的前提下笑笑购买物品的最大重要度之和。
【输入样例】
12 4
3 4
4 5
5 7
8 10
【输出样例】
16
算法思路:
穷举。用一个b数组来存放物品选取的情况,当b[i]=0时表示第i件物品不取,当b[i]=1时表示第i件物品已取,初始化全部取0,可以从后面的物品开始取起,通过b数组的取值把15种取法全部穷举出来,重要度之和max初始化为0。
b[0] b[1] b[2] b[3] b[4]
0 0 0 0 0 {初始化}
0 0 0 0 1 {取第4件物品,价格为8,不超,重要度为10,将max替换为10}
0 0 0 1 0 {取物品3,价格为5,不超,重要度为7,小于max,不换}
0 0 0 1 1 {取物品3,4,价格为13,超}
0 0 1 0 0 {取物品2,价格为4,不超,重要度为5,不换}
0 0 1 0 1
0 0 1 1 0
0 0 1 1 1

0 1 1 1 0{取物品1,2,3,价格为12,重要度为16,将max替换为16}
0 1 1 1 1
1 0 0 0 0{当b[0]=1时停止,b[0]称为哨兵}
 program test_2012_7;
var v,p:array[1..100]of integer; //物品的价格和重要度
    b:array[0..100]  of 0..1;   //表示物品的选取情况
i,j,m,n,max,vsum,psum:integer;
begin
readln(m,n);
 for i:=1 to n do
    readln(v[i],p[i])   ;
fillchar(b,sizeof(b),0);
 max:=0;
 while b[0]=0 do
  begin
   j:=n;
   while b[j]=1 do dec(j);
   b[j]:=1;
   for i:=j+1 to n do b[i]:=0  ;
    vsum:=0;psum:=0;
    for j:=1 to n do
       if b[j]=1 then begin  vsum:=vsum+v[j] ;psum:=psum+p[j]; end;
    if vsum<=m then if max<psum then max:=psum ;
 end;
  writeln( max  );
end.
考点:
分析:
解答:
评论:
老师: