解题 :暴力枚举,二进制枚举状态。。
View Code
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #define inf ~0U>>1 using namespace std; int n,m; const int maxn=100000; struct node0 { int f; int c; }node[maxn]; int flow[maxn]; int cost[maxn]; void init() { int mm=1<<n; for(int i=1;i<mm;i++) for(int j=0;j<n;j++) if(i&1<<j) flow[i]+=node[j].f,cost[i]+=node[j].c; } void solve(int v,int t) { int flage=0; int mm=1<<n; int temp=inf; for(int i=1;i<mm;i++) if(flow[i]*t>=v) flage=1,temp=min(temp,cost[i]); if(flage) cout<<temp<<endl; else cout<<"IMPOSSIBLE"<<endl; return ; } int main() { while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) scanf("%d%d",&node[i].f,&node[i].c); init(); scanf("%d",&m); for(int j=1;j<=m;j++) { int v,t; scanf("%d%d",&v,&t); printf("Case %d: ",j); solve(v,t); } } return 0; }