• 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 }

     

  • 相关阅读:
    105.UDP通信实现广播
    104.tcp多线程读写实现群聊
    103.tcp通信实现远程控制
    102.tcp实现多线程连接与群聊
    101.自动注入
    100.dll调用
    99.遍历进程并直接写入内存
    98.TCP通信传输文件
    97.TCP通信
    96.udp通信
  • 原文地址:https://www.cnblogs.com/Leohh/p/7461197.html
Copyright © 2020-2023  润新知