算法学习笔记——购物单

王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:

主件附件
电脑打印机,扫描仪
书柜图书
书桌台灯,文具
工作椅

如果要买归类为附件的物品,必须先买该附件所属的主件,且每件物品只能购买一次。

每个主件可以有 0 个、 1 个或 2 个附件。附件不再有从属于自己的附件。

王强查到了每件物品的价格(都是 10 元的整数倍),而他只有 N 元的预算。除此之外,他给每件物品规定了一个重要度,用整数 1 5 表示。他希望在花费不超过 N 元的前提下,使自己的满意度达到最大。

满意度是指所购买的每件物品的价格与重要度的乘积的总和,假设设第�i件物品的价格为v[i],重要度为w[i],共选中了k件物品,编号依次为j1​,j2​,...,jk​,则满意度为:v[j1​]∗w[j1​]+v[j2​]∗w[j2​]+…+v[jk​]∗w[jk​]。(其中 * 为乘号)

请你帮助王强计算可获得的最大的满意度。

输入描述:

输入的第 1 行,为两个正整数N,m,用一个空格隔开:

(其中 N ( N<32000 )表示总钱数, m (m <60 )为可购买的物品的个数。)

从第 2 行到第 m+1 行,第 j 行给出了编号为 j-1 的物品的基本数据,每行有 3 个非负整数 v p q

(其中 v 表示该物品的价格( v<10000 ), p 表示该物品的重要度( 1 5 ), q 表示该物品是主件还是附件。如果 q=0 ,表示该物品为主件,如果 q>0 ,表示该物品为附件, q 是所属主件的编号)

输出描述:

 输出一个正整数,为张强可以获得的最大的满意度。

示例1

输入:

1000 5
800 2 0
400 5 1
300 5 1
400 3 0
500 2 0

输出:

2200

示例2

输入:

50 5
20 3 5
20 3 5
10 3 0
10 2 0
10 1 0

输出:

130

说明:

由第1行可知总钱数N为50以及希望购买的物品个数m为5;
第2和第3行的q为5,说明它们都是编号为5的物品的附件;
第4~6行的q都为0,说明它们都是主件,它们的编号依次为3~5;
所以物品的价格与重要度乘积的总和的最大值为10*1+20*3+20*3=130      

代码: 

import java.util.Scanner;
import static java.lang.Math.max;
/*
1000 5
300 5 0
400 2 0
300 5 2
300 4 2
600 4 0

1000 5
800 2 0
400 3 0
400 5 1
300 5 1
500 2 0
 */
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    int w[][] = new int[100][4];
    int v[][] = new int[100][4];
    int q[] = new int[100];
    int f[][] = new int[100][32000];
    int M, N, m, n;
    public void init() {
        Scanner in = new Scanner(System.in);
        M = in.nextInt();
        N = in.nextInt();
        int a=1;
        for (a = 1; a <= N; a++) {
            w[a][0] = in.nextInt();
            v[a][0] = in.nextInt()*w[a][0];
            q[a] = in.nextInt();
        }
        for (a = 1; a <= N; a++){
            if(q[a]!=0){
                for(int b=0;b<4;b++){
                    if(w[q[a]][b]==0){
                        if(b==2){
                            w[q[a]][b+1]=w[q[a]][b-1]+w[a][0];
                            v[q[a]][b+1]=v[q[a]][b-1]+v[a][0];
                        }
                        w[q[a]][b]=w[a][0]+w[q[a]][0];
                        v[q[a]][b]=v[a][0]+v[q[a]][0];

                        break;
                    }

                }

            }
        }

//        for(int b=1;b<=N;b++){
//            for(int c=0;c<4;c++)
//            System.out.print(w[b][c]+" "+v[b][c]+" "+q[b]+" ");
//            System.out.print("\n");
//        }

    }

    public void out(){
        int b=0;
        int a[]=new int[100];
        int max1=0;
        for(int i=1;i<=N;i++)
        {

            for(int j=0;j<=M;j=j+10)
            {
                if(q[i]!=0){break;}
                if(j<w[i][0]) max1=f[b][j];
                else{
                    for(int k=0;k<4;k++){
                        if (j-w[i][k]>=0){
                            max1 = max(max1, f[b][j-w[i][k]]+v[i][k]);
                        }

                    }

                }f[i][j]=max1;
                //System.out.print(f[i][j]+" ");
            }if(q[i]==0)b=i;
            //System.out.print("\n");
        }
        System.out.print(f[b][M]);
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        Main app = new Main();
        app.init();
        app.out();

    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于 jQuery 的事件,我可以和你分享一些学习笔记。 1. 绑定事件 在 jQuery 中,我们可以通过以下方式来绑定事件: ``` $(selector).event(function(){ // 事件处理程序 }) ``` 其中,`selector` 表示要绑定事件的元素,`event` 表示要绑定的事件类型,比如 `click`、`mouseover` 等等。事件处理程序则是在事件触发时要执行的代码块。 2. 多个事件绑定 我们可以通过 `on()` 方法来同时绑定多个事件: ``` $(selector).on({ event1: function(){ // 事件处理程序1 }, event2: function(){ // 事件处理程序2 } }) ``` 这样,当 `event1` 或 `event2` 中任意一个事件触发时,对应的处理程序都会被执行。 3. 解除事件 如果需要解除某个元素的事件处理程序,可以使用 `off()` 方法: ``` $(selector).off(event); ``` 其中,`event` 表示要解除的事件类型。如果不指定事件类型,则会解除该元素上所有的事件处理程序。 4. 事件委托 在 jQuery 中,我们可以使用事件委托来提高性能。事件委托是指将事件绑定到父元素上,而不是绑定到子元素上,然后通过事件冒泡来判断是哪个子元素触发了该事件。这样,当子元素数量较多时,只需要绑定一次事件,就可以监听到所有子元素的事件。 ``` $(selector).on(event, childSelector, function(){ // 事件处理程序 }) ``` 其中,`selector` 表示父元素,`event` 表示要绑定的事件类型,`childSelector` 表示要委托的子元素的选择器,事件处理程序则是在子元素触发事件时要执行的代码块。 以上是 jQuery 中事件的一些基本操作,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值