RQNOJ 622 最小重量机器设计问题:dp

Posted Leohh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RQNOJ 622 最小重量机器设计问题:dp相关的知识,希望对你有一定的参考价值。

题目链接: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 }

 

 

以上是关于RQNOJ 622 最小重量机器设计问题:dp的主要内容,如果未能解决你的问题,请参考以下文章

RQNOJ 169 最小乘车费用:水dp

RQNOJ 342 最不听话的机器人:网格dp

优先队列式分支限界法-最小重量机器设计问题

最小重量机器设计问题

RQNOJ 188 购物问题:树形dp

[DP训练]rqnOJ