poj1170-Ofertas de compra (Completamente mochila + compresión de forma)

El significado de la pregunta: un pedido que contiene b tipos de productos, indique el precio inicial de cada artículo en el pedido y la cantidad que debe comprarse, y luego proporcione s tipos de paquetes, estas combinaciones obtendrán precios más baratos, y cómo para igualarlos para minimizar el precio total.

Solución: Ponga una dimensión que corresponda a cada mercancía, dado que el número de cada mercancía no excede de 5, corresponde al sistema hexadecimal al igual que al sistema decimal;

Por ejemplo: 1 producto x1, 2 producto x2, 3 producto x3 ... Luego se comprime en x1 * 6 a la potencia 0 + x2 * 6 a la potencia + x3 * 6 a la segunda potencia +. . . + xn * 6 elevado a la potencia n-1.

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
void io() { ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); }
const int inf=0x3f3f3f3f;
int dp[500005],h[1005];
int six[]={1,6,36,216,1296,7776,46656};
struct node{
    int has,num,val;
}a[210];
int main() {
    io();
    int b;
    while(cin>>b){
        int ans=0,NUM=0;        //ans:单独购买所需钱数 NUM:购买完所有商品对应的状态
        memset(h,-1,sizeof h);  //商品号对应的六进制状态
        for(int i=0;i<b;i++) {
            int x;
            cin>>x>>a[i].num>>a[i].val;
            h[x]=six[i];
            a[i].has=six[i];
            ans+=a[i].num*a[i].val;
            NUM+=six[i]*a[i].num;
            a[i].num=six[i];        //将其数量转换成其对应的状态
        }
        int n,x; cin>>n;
        for(int i=0;i<n;i++) {
            cin>>x;
            int c,k;
            while(x--){
                cin>>c>>k;
                if(h[c]==-1) continue;
                a[i+b].num+=h[c]*k; //将套餐变为对应的六进制
            }
            cin>>a[i+b].val;
        }
        memset(dp,inf,sizeof(dp));
        dp[0]=0;    //完全背包
        for(int i=0;i<b+n;i++){
            for(int j=a[i].num;j<=NUM;j++)
                dp[j]=min(dp[j],dp[j-a[i].num]+a[i].val);
        }
        cout<<min(ans,dp[NUM])<<endl;
    }
    return 0;
}

Enlace de referencia: https://blog.csdn.net/stay_accept/article/details/51164607

Supongo que te gusta

Origin blog.csdn.net/qq_44132777/article/details/105981250
Recomendado
Clasificación