1 条题解
-
0
C :
#include<stdio.h> #include<math.h> int c[6001],w[6001],p[6001]; int f[6001]; int N,M; int max(int x,int y) { if(x<y) return y; else return x; } int main() { scanf("%d%d",&M,&N); for(int i=1;i<=N;++i) { scanf("%d%d%d",&w[i],&c[i],&p[i]); } for(int i=1;i<=N;++i) { if(p[i]==0) { for(int j=w[i];j<=M;++j) { f[j]=max(f[j],f[j-w[i]]+c[i]); } } else { for(int j=1;j<=p[i];++j) { for(int k=M;k>=w[i];--k) { f[k]=max(f[k],f[k-w[i]]+c[i]); } } } } printf("%d",f[M]); return 0; }
C++ :
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int w[10000],c[10000],p[10000],f[10000],i,j,n,m,k; int main () { cin>>m>>n; for (i=1; i<=n; i++) cin>>w[i]>>c[i]>>p[i]; for (i=1; i<=n; i++) if (p[i]==0) { for (j=w[i]; j<=m; j++) f[j]=max(f[j],f[j-w[i]]+c[i]); } else { for (j=1; j<=p[i]; j++) for (k=m; k>=w[i]; k--) f[k]=max(f[k],f[k-w[i]]+c[i]); } cout<<f[m]; }
Pascal :
program zxt; var w,a,c,f:array [0..200] of integer; i,m,n,x:integer; function max(x,y:integer):integer; begin if x>y then max:=x else max:=y; end; procedure ling; var j:integer; begin for j:=m downto 1 do if j>=c[i] then f[j]:=max(f[j],f[j-c[i]]+w[i]); end; procedure wan; var j,k:integer; begin for j:=1 to m do for k:=1 to (m div c[i]) do if j>=k*c[i] then f[j]:=max(f[j],f[j-c[i]*k]+w[i]*k); end; procedure jj; var num,k:integer; begin num:=n; if c[i]*a[i]>m then a[i]:=m div c[i]; k:=2; while k*2-1<=a[i] do begin inc(num); c[num]:=c[i]*k; w[num]:=w[i]*k; k:=k*2; a[num]:=1; end; k:=a[i]-k+1; if k>0 then begin inc(num); c[num]:=c[i]*k; w[num]:=w[i]*k; a[num]:=1; end; n:=num; end; begin readln(m,n); fillchar(f,sizeof(f),0); fillchar(a,sizeof(a),0); for i:=1 to n do readln(c[i],w[i],a[i]); x:=n; for i:=1 to x do if a[i]>1 then jj; x:=n; for i:=1 to x do if a[i]=0 then wan else ling; writeln(f[m]); end.
- 1
信息
- ID
- 700
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者