最大人品
2015-08-10 12:27
190 查看
试题描述 |
KFC 一共有 N 种套餐:用 1 到 N 标号,每种套餐都有一个价钱。共有 M 个同学,每个同学都要订一份套餐,而且由于每个人对于不同套餐的喜爱度不同,对于 WX 买的不同套餐,会给 WX 涨不同数目的人品。 WX 身上只有 K 元钱,他想在他能负担得起的情况下获得最多的人品,这样他今年 OI 就更稳了。 |
输入 |
第一行为三个数 N,M,K。 第二行 N 个数 ai 表示第 i 种套餐的价格。 接下来是 M 行 N 列的矩阵,第 i+2 行第 j 列的数表示 WX 为第 i 个同学买到第 j 种套餐后,上涨的人品数。 所有输入数据均为正整数。 |
输出 |
一行一个数k,表示可以获得的最大人品。如不能给每人都卖到套餐,WX 就要悲剧了,此时输出“@_@”(不包含引号)。 |
输入示例 |
2 3 5 1 3 4 7 3 7 1 5 |
输出示例 |
12 |
其他说明 |
100%的数据保证 N<=10,M<=15,答案<longint |
#include<iostream> using namespace std; long int jg[21],a[21][21],js[16][1000]; long int n,m,k,z=0,maxn,minj=99999; void dfs(long int,long int,long int); int main() { cin>>n>>m>>k; for(int i=1;i<=n;i++) { cin>>jg[i]; if(minj>jg[i]) minj=jg[i]; } for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) cin>>a[i][j]; dfs(0,0,0); if(maxn==0) cout<<"@_@"; cout<<maxn; } void dfs(long int rp,long int hf,long int tc) { if(hf>=js[tc][rp]&&js[tc][rp]!=0) return; else js[tc][rp]=hf; if(hf+(m-tc)*minj>k) return; if(tc==m){maxn=max(maxn,rp);return;} for(int i=1;i<=n;i++) dfs(rp+a[tc+1][i],hf+jg[i],tc+1); }