poj 3459
题意:题目大意是说n个人做m项工程,然后给出工人的薪水,和工程按期完工的概率,以及按时完工的酬劳和未按时完工的罚款,要求出最大利润。。需要注意的 是,薪水输出的是欧元为单位,输出的是以分为单位。(number是数量的意思,也即给出的是若干个人做同一个工程完工的概率)
刚开始题意理解错了,咳。
dp[i][j]=dp[i-1][j-k]+cost[i][k];
dp[i][j]表示i个工程用j个人的最大收益。(注意搭配dp[i][j]可能为负数,因此wa一次)
#include<iostream> #include<fstream> using namespace std; int m,n,c; int dp[110][110]; int p[110][110]; int cost[110][110]; void read(){ // ifstream cin("in.txt"); int i,j,k; int K; cin>>K; while(K--){ cin>>m>>n>>c; for(i=1;i<=m;i++) for(j=1;j<=n+2;j++) cin>>p[i][j]; for(i=1;i<=m;i++) for(j=0;j<=n;j++) cost[i][j]=p[i][j]*(p[i][n+1]-c*j)-(100-p[i][j])*p[i][n+2]; for(i=1;i<=n;i++) dp[0][i]=-100*c*i; for(i=1;i<=m;i++) dp[i][0]=-1*p[i][n+2]*100+dp[i-1][0]; for(i=1;i<=m;i++) for(j=1;j<=n;j++) { dp[i][j]=-999999999; for(k=0;k<=j;k++) dp[i][j]=max(dp[i][j],dp[i-1][j-k]+cost[i][k]); } j=-999999999; for(i=0;i<=n;i++) j=max(dp[m][i],j); cout<<j<<endl; for(i=0;i<=n;i++) if(dp[m][i]==j) cout<<i<<' '; cout<<endl; } } int main(){ read(); return 0; }