poj1170

题目链接

有5种物品,给出每个物品的单价。

给出几个这些物品的组合和这个组合的价格。买组合要比一件件的买便宜。

问给定的购买计划最少花多少钱。

------------------------------------------------------------------------------------------------

因为最多有5种,可以用一个5位数表示状态。

然后就是完全背包了。f[v]为状态v的最小花费。注意初始状态为f[0]=0;其余为无穷大。

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>

#define MAX(a,b) ((a)>=(b)?(a):(b))
#define MIN(a,b) ((a)<=(b)?(a):(b))
#define OO 0x0fffffff
using namespace std;
const int N = 128;
int f[66666];
int cost[N],value[N];
int mapp[1024];

bool cmp(int a,int b){
    for(int i=0;i<5;i++){
        int tb = b%10;
        if( tb > 5 ) return false;
        if((a%10)>tb) return false;
        a/=10; b/=10;
    }
    return true;
}

int main(){
    int m,n,t,code,cnt,goal;
    goal = 0;
    cin>>m;
    for(int i=0;i<m;i++){
        cin>>code>>cnt>>cost[i];
        mapp[code] = i;
        value[i] = pow(10,i);
        goal += cnt*value[i];
    }
    cin>>n; n += m;
    for(int i=m;i<n;i++){
        value[i] = 0;
        cin>>t;
        while(t--){
            cin>>code>>cnt;
            value[i]+=(int)pow(10,mapp[code])*cnt;
        }
        cin>>cost[i];
    }

    for(int i=1;i<goal+8;i++) f[i]=OO;
    f[0]=0;
    for(int i=0;i<n;i++){
        for(int v=value[i];v<=goal;v++){
            if(cmp(value[i],v)){
                f[v] = MIN(f[v],f[v-value[i]]+cost[i]);
            }
        }
    }
    printf("%d
",f[goal]);
    return 0;
}
原文地址:https://www.cnblogs.com/redips-l/p/6866321.html