1 条题解
-
0
C :
#include "stdio.h" int m,n,k; int a[1000],b[1000],c[1000],w[30][80]; int main() { int i,j,l,t1,t2;; scanf("%d%d%d",&m,&n,&k); memset(w,127,sizeof(w)); w[0][0]=0; for(i=0;i<k;i++) scanf("%d%d%d",&a[i],&b[i],&c[i]); for(i=0;i<k;i++) { for(j=m;j>=0;j--) for(l=n;l>=0;l--) { t1=j+a[i]; t2=l+b[i]; if(t1>m)t1=m; if(t2>n)t2=n; if(w[t1][t2]>w[j][l]+c[i]) w[t1][t2]=w[j][l]+c[i]; } } printf("%d\n",w[m][n]); return 0; }
C++ :
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int m,n,k; int f[30][80],a[1001],b[1001],c[1001]; int main() { //此题跟一般的背包问题不一样,一般问题是要限制容量, //而此题是需要至少满足多少容量,这样f数组要赋值为一个大数 cin>>m>>n; cin>>k; memset(f,0x7f,sizeof(f)); f[0][0]=0;//什么都不放 for(int i=1;i<=k;i++) cin>>a[i]>>b[i]>>c[i]; for(int i=1;i<=k;i++) for(int j=m;j>=0;j--) for(int k=n;k>=0;k--) { int y,d; y=j+a[i];d=k+b[i];//如果体积超过需要,当作最低需求处理 if(y>m) y=m; if(d>n) d=n; if(f[y][d]>f[j][k]+c[i]) f[y][d]=f[j][k]+c[i]; } cout<<f[m][n]<<endl; return 0; }
Pascal :
program DimensionPack;//二维背包 const maxv=1000; maxn=1000; var f:array[0..maxv,0..maxv]of longint; a,b,w:array[1..maxn]of longint; n,v,u:longint; procedure main; var i,j,k,max:longint; begin readln(v,u,n); for i:=1 to n do readln(a[i],b[i],w[i]); for i:=0 to 100 do for j:=0 to 100 do f[i,j]:=10000000; f[0,0]:=0; for i:=1 to n do begin for j:=100 downto 0 do for k:=100 downto 0 do if f[j,k]+w[i]<f[j+a[i],k+b[i]] then f[j+a[i],k+b[i]]:=f[j,k]+w[i];//状态转移方程 end; max:=maxlongint; for i:=v to 100 do for j:=u to 100 do if f[i,j]<max then max:=f[i,j]; writeln(max); end; begin main; end.
- 1
信息
- ID
- 782
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者