华为oj-购物单(依赖背包问题)

以下两个都是正确答案,之前错误是因为不能import自己的包。方法一时间复杂度为θ(VN),有问题,不能包括所有情况;方法二时间复杂度为θ()

方法1:

import java.util.*;

class Item
{
    int price;
    int weight;
    int affiliation;
    public Item(int price,int weight,int affiliation) {
        this.price=price;
        this.weight=weight;
        this.affiliation=affiliation;
    }
}
public class Main
{
    public static void main(String[] arg)
    {
        ArrayList<Item> items;
        Scanner scan=new Scanner(System.in);
        int all_cash=scan.nextInt()/10;
        int item_num=scan.nextInt();
        items=new ArrayList<Item>(item_num);
        int i,j,multi,multi_father,idx;
        Item father,itm;
        boolean[][] visit=new boolean[all_cash+1][item_num];
        int[] box=new int[all_cash+1];
        for(i=0;i<item_num;i++)
        {
            items.add(new Item(scan.nextInt()/10, scan.nextInt(), scan.nextInt()));     
        }
        for(i=0;i<item_num;i++)
        {   
            itm=items.get(i);
            multi=itm.price*itm.weight;
            if(itm.affiliation>0)
            {
                father=items.get(itm.affiliation-1);
                multi_father=father.price*father.weight;
                for(j=all_cash;j>=itm.price;j--)
                {
                    idx=j-itm.price;
                    if(!visit[idx][itm.affiliation-1])
                    {
                        idx-=father.price;
                        if(idx>=0&&box[j]<box[idx]+multi+multi_father)
                        {
                            box[j]=box[idx]+multi+multi_father;
                            visit[j]=Arrays.copyOf(visit[idx], item_num);
                            visit[j][i]=true;
                            visit[j][itm.affiliation-1]=true;
                        }
                    }
                    else if(box[j]<box[idx]+multi){
                        box[j]=box[idx]+multi;
                        visit[j]=Arrays.copyOf(visit[idx], item_num);
                        visit[j][i]=true;
                    }
                }
            }
            else {
                for(j=all_cash;j>=itm.price;j--)
                {
                    idx=j-itm.price;
                    if(box[j]<box[idx]+multi)
                    {
                        box[j]=box[idx]+multi;
                        visit[j]=Arrays.copyOf(visit[idx], item_num);
                        visit[j][i]=true;
                    }

                }
            }

        }
        System.out.println(box[all_cash]*10);
    }
}

方法2:

import java.util.*;
class Item
{
    int price;
    int value;
    public Item()
    {
    }
    public Item(int price,int weight) {
        this.price=price;
        this.value=price*weight;
    }
}
class MainItem extends Item
{
    ArrayList<Item> list;
    public MainItem(int price,int weight) {
        super(price,weight);
        list=new ArrayList<Item>(2);
    }
}
public class Main
{
    public static void main(String[] arg)
    {
        Scanner scan=new Scanner(System.in);
        int all_cash=scan.nextInt()/10;
        int item_num=scan.nextInt();

        ArrayList<MainItem> main_items=new ArrayList<MainItem>(item_num);
        Item main_itm,itm;
        int[] box=new int[all_cash+1];
        int[] item_idx=new int[item_num];
        int i,j,idx,value,price,weight,affiliation;

        for(i=0;i<item_num;i++)
        {
            price=scan.nextInt()/10;
            weight=scan.nextInt();
            affiliation=scan.nextInt();
            if(affiliation==0)
            {
                item_idx[i]=main_items.size();
                main_items.add(new MainItem(price, weight));
            }
            else {
                main_items.get(item_idx[affiliation-1]).list.add(new Item(price, weight));
            }
        }
        for(MainItem mitm:main_items)
        {   
            for(j=all_cash;j>=mitm.price;j--)
            {
                switch(mitm.list.size())
                {
                case 2:
                    idx=j-mitm.price-mitm.list.get(1).price;
                    value=mitm.value+mitm.list.get(1).value;
                    if(idx>=0&&box[j]<box[idx]+value)
                    {
                        box[j]=box[idx]+value;
                    }
                    idx-=mitm.list.get(0).price;
                    value+=mitm.list.get(0).value;
                    if(idx>=0&&box[j]<box[idx]+value)
                    {
                        box[j]=box[idx]+value;
                    }
                case 1:
                    idx=j-mitm.price-mitm.list.get(0).price;
                    value=mitm.value+mitm.list.get(0).value;
                    if(idx>=0&&box[j]<box[idx]+value)
                    {
                        box[j]=box[idx]+value;
                    }
                case 0:
                    idx=j-mitm.price;
                    value=mitm.value;
                    if(box[j]<box[idx]+value)
                    {
                        box[j]=box[idx]+value;
                    }
                default:
                }
            }
        }
        System.out.println(box[all_cash]*10);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值