//BÀI TOÁN CÁI BA LÔ 2 DÙNG THUẬT TOÁN QUY HOẠCH ĐỘNG

//Các bạn tự tạo file dữ liệu
#include<stdio.h>
#include<string.h> #include<malloc.h> typedef struct{ char TenDV[30]; int TL,GT,PA,SL; }DoVat2; typedef int bang[50][100]; DoVat2* ReadFromFile( int *W, int *n){ FILE *f; f=fopen("QHD_CaiBalo2.inp","r"); fscanf(f,"%d",W); DoVat2 *dsdv; dsdv=(DoVat2*)malloc(sizeof(DoVat2)); int i=0; while(!feof(f)){ fscanf(f,"%d%d%d%[^\n]", &dsdv[i].TL,&dsdv[i].GT,&dsdv[i].SL,&dsdv[i].TenDV); dsdv[i].PA=0; i++; dsdv=(DoVat2*)realloc(dsdv,sizeof(DoVat2)*(i+1)); } *n=i; fclose(f); return dsdv; } void InDs(DoVat2 *dsdv,int W,int n){ int i, TongGT=0, TongTL=0; printf("|---|------------------|----------|----------|----------|----------|\n"); printf("|STT| Ten Do Vat | TL | GT | SL | PA |\n"); printf("|---|------------------|----------|----------|----------|----------|\n"); for(i=0;i<n;i++){ printf("|%2d |%-18s|%5d |%5d |%5d |%5d |\n", (i+1),dsdv[i].TenDV,dsdv[i].TL,dsdv[i].GT,dsdv[i].SL,dsdv[i].PA); TongGT= TongGT +dsdv[i].PA*dsdv[i].GT; TongTL= TongTL +dsdv[i].PA*dsdv[i].TL; } printf("|---|------------------|----------|----------|----------|----------|\n"); printf("Trong luong cua balo= %-5d\n",W); printf("Tong gia tri = %-5d\n",TongGT); printf("Tong trong luong = %-5d\n",TongTL); } int min(int a, int b){ return a<b? a:b; } void TaoBang2(DoVat2 *dsdv, int n, int W, bang F, bang X){ int xk,yk,k; int Fmax,Xmax,V; for(V=0;V<=W;V++){ X[0][V]= min(V/dsdv[0].TL, dsdv[0].SL); F[0][V]= X[0][V]*dsdv[0].GT; } for(k=1;k<=n;k++) for(V=0;V<=W;V++){ Fmax=F[k-1][V]; Xmax=0; yk=min(V/dsdv[k].TL,dsdv[k].SL); for(xk=0;xk<=yk;xk++) if( F[k-1][V-xk*dsdv[k].TL]+ xk*dsdv[k].GT > Fmax){ Fmax=F[k-1][V-xk*dsdv[k].TL]+ xk*dsdv[k].GT; Xmax=xk; } F[k][V]=Fmax; X[k][V]=Xmax; } } void InBang2( int n, int W, bang F, bang X){ int k,V; for(k=1;k<=n;k++){ for(V=0;V<=W;V++) printf("|%4d%2d", F[k][V], X[k][V]); printf("\n"); } } void Trabang(DoVat2 *dsdv, int n, int W, bang F, bang X){ int k, V; V=W; for(k=n-1;k>=0;k--){ dsdv[k].PA= X[k][V]; V= V - X[k][V]*dsdv[k].TL; } } int main(){ int n,W; bang F,X; DoVat2 * dsdv; dsdv= ReadFromFile(&W,&n); TaoBang2(dsdv,n,W,F,X); InBang2(n,W,F,X); printf("\n"); Trabang(dsdv,n,W,F,X); InDs(dsdv,W,n); free(dsdv); return 0; }
