背景
北京奧運會開幕了,這是中國人的驕傲和自豪,中國健兒在運動場上已經創造了一個又一個輝煌,super pig也不例外………………
描述
雖然興奮劑是奧運會及其他重要比賽的禁藥,是禁止服用的。但是運動員爲了提高成績難免要服用一些,super pig也不例外。爲了不被尿檢檢查出來,這些藥品就只能選一些不容易被發現的來服用。但是奧委會關於興奮劑檢查有很多個指標,只有尿檢中各項數值均不高於規定指標纔算成陰性(“你沒服興奮劑”),所以如何服用適量的藥品使自己的水平達到最高是每個運動員困擾的問題。
現在有n個藥品,每個藥品如服用就必須全部用掉(否則會有副作用)。尿檢檢查共有m個項目,服用每個藥品對於每個檢查項目都會得到一定的效果值,這些效果值是累加的;服用每個藥品當然還會給super pig一些水平提高值,這些效果也是累加的。現在super pig想把問題交給你來解決,因爲吃藥歸吃藥,訓練才重要。
格式
輸入格式
第一行有兩個整數n (0<n<=200)和m (1<=m<=5),分別表示藥品數和需要檢查的項目;
第二行m個整數 v1,v2,⋯,vmv_1,v_2,\cdots,v_mv1,v2,⋯,vm,表示檢查各項目的指標(即最高不能超過的值);
第三行到第n+2行,分別是這n個藥品的資料,每行m+1個數。每行第一個數表示服用該藥品所得到的水平提高值,第二到第m+1個數分別表示服用這個藥品每一項的效果值(分別對應第二行的指標類型)。
0≤∑k=1mvk≤50000000\le \sum_{k=1}^m v_k\le 50000000≤∑k=1mvk≤5000000.
輸出格式
一個整數,即super pig通過服這些藥在不被檢查出來的條件下所能得到的最高水平提高值
樣例1
樣例輸入1
5 1
6
7 3
8 5
3 1
6 2
4 3
樣例輸出1
16
限制
各個測試點1s
思路:沒啥意思,多位揹包加01揹包;
就是處理的是麻煩。。。。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define INF 0x3f3f3f3f
using namespace std;
int a1,a2,a3,a4,a5;
int j,k;
int ans,m,n;
int a[10000010];
int b[210][10];
int f[10];
int main()
{
scanf("%d%d",&n,&m);
for (int i=1; i<=m; i++)
{
scanf("%d",&f[i]);
}
for (int i=1; i<=n; i++)
for (int j=0; j<=m; j++)
scanf("%d",&b[i][j]);
for (int i=1; i<=n; i++)
for (a1=f[1]; a1>=b[i][1]; a1--)
for (a2=f[2]; a2>=b[i][2]; a2--)
for (a3=f[3]; a3>=b[i][3]; a3--)
for (a4=f[4]; a4>=b[i][4]; a4--)
for (a5=f[5]; a5>=b[i][5]; a5--)
{
j=(((a1*(f[2]+1)+a2)*(f[3]+1)+a3)*(f[4]+1)+a4)*(f[5]+1)+a5;
k=((((a1-b[i][1])*(f[2]+1)+(a2-b[i][2]))*(f[3]+1)+(a3-b[i][3]))*(f[4]+1)+(a4-b[i][4]))*(f[5]+1)+a5-b[i][5];
if (a[k]+b[i][0]>a[j])
{
a[j]=a[k]+b[i][0];
if (a[j]>ans) ans=a[j];
}
}
cout<<ans<<endl;
return 0;
}