poj 1170 记忆化搜索

来源:互联网 发布:台湾大陆 知乎 编辑:程序博客网 时间:2024/06/05 18:34

就是简单的记忆化搜索

dp[num0][num1][num2][num3][num4] 表示数量分别为num0 num1....num4的五种物品的最少价钱

然后向下dp就是的啦~~~~~~

AC代码如下:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define MAX 0x3f3f3f3fstruct BP{    int cnt;    int num[6];    int price;};int hashs[1000];BP bp[100];int B, S;int number[6], price[6];int dp[6][6][6][6][6];int DFS( int num0, int num1, int num2, int num3, int num4 ){    if( !( num0 || num1 || num2 || num3 || num4 ) ){        return 0;    }    if( dp[num0][num1][num2][num3][num4] != MAX ){        return dp[num0][num1][num2][num3][num4];    }    int ans = MAX;    for( int i = 0; i < S; i++ ){        if( num0 >= bp[i].num[0] && num1 >= bp[i].num[1] && num2 >= bp[i].num[2] && num3 >= bp[i].num[3] && num4 >= bp[i].num[4] ){            ans = min( ans, bp[i].price + DFS( num0 - bp[i].num[0],                                                num1 - bp[i].num[1],                                                num2 - bp[i].num[2],                                                num3 - bp[i].num[3],                                                num4 - bp[i].num[4]) );        }    }    ans = min( ans, num0 * price[0] + num1 * price[1] + num2 * price[2] + num3 * price[3] + num4 * price[4] );    return dp[num0][num1][num2][num3][num4] = ans;}int main(){    while( scanf( "%d", &B ) != EOF ){        memset( number, 0, sizeof( number ) );        memset( price, 0, sizeof( price ) );        memset( hashs, 0, sizeof( hashs ) );        memset( dp, 0x3f, sizeof( dp ) );        memset( bp, 0, sizeof( bp ) );        int pos = 0;        for( int i = 0; i < B; i++ ){            int temp1, temp2, temp3;            cin >> temp1 >> temp2 >> temp3;            hashs[temp1] = pos;            number[pos] = temp2;            price[pos] = temp3;            pos++;        }        cin >> S;        for( int i = 0; i < S; i++ ){            cin >> bp[i].cnt;            for( int j = 0; j < bp[i].cnt; j++ ){                int temp;                cin >> temp;                cin >> bp[i].num[hashs[temp]];            }            cin >> bp[i].price;        }        cout << DFS( number[0], number[1], number[2], number[3], number[4] ) << endl;    }    return 0;}


0 0