638. Pacote de presente

Na loja LeetCode, existem muitos itens à venda.

No entanto, também existem alguns pacotes de presentes, e cada pacote de presentes agrupa um conjunto de itens a um preço favorável.

Dado o preço de cada item, cada pacote de presente contém uma lista de itens e uma lista de itens a serem comprados. Por favor, imprima o custo mínimo exato para completar a lista pendente.

Cada pacote de presente é descrito por um conjunto de dados em uma matriz, o último número representa o preço do pacote de presente e os outros números indicam o número de outros tipos de itens contidos.

Qualquer pacote de presente pode ser adquirido por tempo ilimitado.

Exemplo 1:

Entrada: [2,5], [[3,0,5], [1,2,10]], [3,2]
Saída: 14
Explicação:
Existem dois itens A e B, o preço é ¥ 2 e ¥ 5.
Série 1, você pode comprar 3A e 0B por ¥ 5.
Série 2, você pode comprar 1A e 2B por ¥ 10.
Você precisa comprar 3 A e 2 B, então pagou ¥ 10 para comprar 1A e 2B (Gift Pack 2) e ¥ 4 para comprar 2A.
Exemplo 2:

Entrada: [2,3,4], [[1,1,0,4], [2,2,1,9]], [1,2,1]
Saída: 11
Explicação:
A, B, C Os preços são ¥ 2, ¥ 3, ¥ 4.
Você pode comprar 1A e 1B com ¥ 4, ou você pode comprar 2A, 2B e 1C com ¥ 9.
Você precisa comprar 1A, 2B e 1C, portanto pagou ¥ 4 por 1A e 1B (Pacote de presente 1), e ¥ 3 por 1B e ¥ 4 por 1C.
Você não pode comprar itens que estão além da lista a ser comprada, embora seja mais barato comprar a farra 2.

Nota:
Até 6 itens e 100 pacotes de presentes.
Para cada item, você só precisa comprar no máximo 6.
Você não pode comprar itens que estão além da lista a ser comprada, mesmo que sejam mais baratos.

Fonte: LeetCode


O que essa pergunta diz, embora tenha sido escrita por cerca de uma hora, é realmente uma questão de pensamento independente e conclusão no ensino médio.
Escreva rapidamente sobre a formação
desta pergunta : 1. Esta pergunta deve ser recursiva. Como resolver a recursão?
2. Áustria, você precisa listar todas as soluções possíveis de forma recursiva e encontrar a menor resposta.
3. Como escrever vários elementos de recursão?

  • Condição final: não pode comprar mais, só precisa estar certo. Mais tarde, desenvolveu-se para não ter excedentes (tudo o que você deseja comprar).
    Há um processo no meio, pensando nesse problema recursivo a ser resolvido : basta comprar tudo . Pensar aqui é uma realização repentina; portanto, a condição final deve ser que as coisas sejam compradas. A princípio, pensei na condição final da recursão, mas não pensei no problema real resolvido por essa recursão. Desviado da realidade. Pense na próxima vez, até que ponto eu o fiz antes de não fazê-lo .
  • Assunto: O tema deve estar comprando
    • Primeiro compre uma farra e depois compre um único produto.
    • Compre uma farra para ver se você pode comprá-lo. Pode comprar, recursivo; não pode comprar, veja o próximo grande pacote de presentes.
    • Por fim, verifique se há vagas ausentes e compre os itens não vendidos.
    • Hesitado depois de escrever, deve ser o 优先级 (当时理解成代码的执行顺序 )mesmo que o pacote de presentes e deve ser montado. Então eu pensei sobre isso novamente, o pacote de presente deve ser descontado.

4. Finalmente, descobriu que a resposta está errada, pense que a variável do meio está errada (ans- = special [i] [j]; não existe essa linha). Alterado e bem-sucedido.
Finalmente, com relação ao problema de prioridade, adicione ans- = special [i] [j] e pense sobre isso, para que a prioridade seja a mesma. O entendimento agora é que todos têm a oportunidade de comprá-lo.
Ou apenas mude dfs(price,special,needs,ans+special[i][j]).

int eans=0x3f3f3f3f;
    int shoppingOffers(vector<int>& price, vector<vector<int>>& special, vector<int>& needs) {
      
        dfs(price,special,needs,0);
        return eans;
    }
    void dfs(vector<int>& price, vector<vector<int>>& special, vector<int>& needs,int ans){
        int flag=0;
        for(auto a:needs){
            flag+=a;
        }
        if(flag==0){
            eans=min(ans,eans);
            return;
        } 
        //需要的  都  买完了。所以结束递归,返回价钱。

        //开始买大礼包
        for(int i=0;i<special.size();i++){
            //看看大礼包能不能买,不能买的的话,看下一个大礼包
            int flag1=true;
            int j;
            for(j=0;j<needs.size();j++){
                if(special[i][j]>needs[j]) {
                    flag1=false;
                    break;
                }
            }

            //要是可以买大礼包,则递归
            if(flag1){
                ans+=special[i][j];//把大礼包的价钱加上
                for(j=0;j<special[i].size()-1;j++) needs[j]-=special[i][j];//把需求减去
                dfs(price,special,needs,ans);//继续看下一个礼包,
                //递归之后,需要需求加回来
                for(j=0;j<special[i].size()-1;j++) needs[j]+=special[i][j];
                ans-=special[i][j];//把大礼包的价钱减去
            }
        }
        //大礼包买完了,开始买单价商品
        vector<int>tep=needs;
        int tepp=0;
        for(int i=0;i<needs.size();i++){
            if(needs[i]!=0){
                tepp+=needs[i]*price[i];
                needs[i]=0;
            }
        }
        ans+=tepp;
        //cout<<ans<<endl;
        dfs(price,special,needs,ans);
        needs=tep;
        ans-=tepp;
    }
Publicado 161 artigos originais · Gosto 68 · Visitantes com mais de 20.000

Acho que você gosta

Origin blog.csdn.net/qq_43179428/article/details/104310922
Recomendado
Clasificación