codeforces 510D 01背包的map形式

来源:互联网 发布:了解茶的软件 编辑:程序博客网 时间:2024/05/21 09:28

从一些数字重选择出x个数字,让他们的gcd == 1并且让,选择这些数字的代价最小。


#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <map>#define MAX 307using namespace std;typedef pair<int,int> PII;typedef map<int,int> MII;int n;MII dp;PII a[MAX];int gcd ( int a , int b ){    return !b?a:gcd ( b , a%b );}int main ( ){    while ( ~scanf ("%d" , &n ) )    {        for ( int i = 0 ; i < n ; i++ )            scanf ( "%d" , &a[i].first );        for ( int i = 0 ; i < n ; i++ )            scanf ( "%d" , &a[i].second );                            dp.clear();        MII::iterator it;        dp[0] = 0; // 背包问题的另一种思路        for ( int i = 0; i < n ; i++ )        {            int x = a[i].first;            int c = a[i].second;                        for (it = dp.begin(); it != dp.end(); it++) {                int y = it->first;                int d = gcd(x, y);                int temp = it->second+c;                if (dp[d] && dp[d] < temp) continue;                dp[d] = temp;            }        }        if ( !dp[1] ) puts ( "-1" );        else printf ( "%d\n" , dp[1] );    }}


0 0