题目链接:https://www.rqnoj.cn/problem/622
题意:
一个机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。
w[i][j]是从供应商j处购得的部件i的重量,c[i][j] 是相应的价格。
试设计一个算法,给出总价格不超过d的最小重量机器设计。
题解:
表示状态:
dp[i][j] = min weight
i:考虑到第i个零件
j:当前花费
找出答案:
min dp[n][j] (0<=j<=d)
如何转移:
对于当前零件i,枚举不同的供应商j,转移到相应的下一个dp。
dp[i+1][j+c[i][k]] = min dp[i][j] + w[i][k]
边界条件:
dp[0][0] = 0
others = -1
AC Code:
1 // state expresssion: 2 // dp[i][j] = min weight 3 // i: considering ith component 4 // j: present cost 5 // 6 // find the answer: 7 // min dp[n][j] (0<=j<=d) 8 // 9 // transferring: 10 // now: dp[i][j] 11 // dp[i+1][j+c[i][k]] = min dp[i][j] + w[i][k] 12 // 13 // boundary: 14 // dp[0][0] = 0 15 // others = -1 16 #include <iostream> 17 #include <stdio.h> 18 #include <string.h> 19 #define MAX_N 1005 20 #define MAX_M 1005 21 #define MAX_D 1005 22 #define INF 10000000 23 24 using namespace std; 25 26 int n,m,d; 27 int ans; 28 int w[MAX_N][MAX_M]; 29 int c[MAX_N][MAX_M]; 30 int dp[MAX_N][MAX_D]; 31 32 void read() 33 { 34 cin>>n>>m>>d; 35 for(int i=0;i<n;i++) 36 { 37 for(int j=0;j<m;j++) 38 { 39 cin>>c[i][j]; 40 } 41 } 42 for(int i=0;i<n;i++) 43 { 44 for(int j=0;j<m;j++) 45 { 46 cin>>w[i][j]; 47 } 48 } 49 } 50 51 void solve() 52 { 53 memset(dp,-1,sizeof(dp)); 54 dp[0][0]=0; 55 for(int i=0;i<n;i++) 56 { 57 for(int j=0;j<=d;j++) 58 { 59 if(dp[i][j]!=-1) 60 { 61 for(int k=0;k<m;k++) 62 { 63 if(dp[i+1][j+c[i][k]]==-1 || dp[i+1][j+c[i][k]]>dp[i][j]+w[i][k]) 64 { 65 dp[i+1][j+c[i][k]]=dp[i][j]+w[i][k]; 66 } 67 } 68 } 69 } 70 } 71 ans=INF; 72 for(int i=0;i<=d;i++) 73 { 74 if(dp[n][i]!=-1) 75 { 76 ans=min(ans,dp[n][i]); 77 } 78 } 79 } 80 81 void print() 82 { 83 cout<<ans<<endl; 84 } 85 86 int main() 87 { 88 read(); 89 solve(); 90 print(); 91 }