1 条题解
-
0
C++ :
#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N=20; int val[N][N],f[N][N]={0}; /*这是一个典型的动态规划试题。用机器数来做状态,数组 F[I, J]表示前 I 个公司分配 J 台机器的最大盈利。则状态转移方程为 F[I, J]=Max{F[I-1, K] + Value[I, J-K]} ( 0〈 =K〈 =J〉*/ void show(int,int); int n,m,ans; int main(){ cin>>n>>m; for(int i=1;i<=n;i++)//val[i,j]~第i个分j个价值 for(int j=1;j<=m;j++) cin>>val[i][j]; //边界f[0][0]=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=0;k<=j;k++) f[i][j]=max(f[i][j],f[i-1][k]+val[i][j-k]); cout<<f[n][m]<<endl; ans=f[n][m]; show(n,m); return 0; } void show(int i,int j){//输出分配情况 int k; if(i==0) return ; for(int k=0;k<=j;k++) if(ans==f[i-1][k]+val[i][j-k]){ ans=f[i-1][k]; show(i-1,k); cout<<i<<" "<<j-k<<endl; break; } }
Pascal :
var m,n,i,j,k,max:longint; f,a:array[0..10,0..15]of longint; procedure print(i,j:longint); var k:longint; begin if i=0 then exit; for k:=0 to j do if max=f[i-1,k]+a[i,j-k] then begin max:=f[i-1,k]; print(i-1,k); writeln(i,' ',j-k); exit; end; end; begin readln(n,m); for i:=1 to n do for j:=1 to m do read(a[i,j]); for i:=1 to n do for j:=1 to m do begin max:=0; for k:=0 to j do if f[i-1,k]+a[i,j-k]>max then max:=f[i-1,k]+a[i,j-k]; f[i,j]:=max; end; writeln(f[n,m]); print(n,m); end.
- 1
信息
- ID
- 612
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者