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;
}