4 条题解

  • 7
    @ 2023-8-3 16:13:22
    思路 (1)状态定义: $\\$定义$f[i]$表示消耗$i$的体力最多可以搬运的体积 $\\$(2)初始状态: $\\$不需要特殊处理,嗯其实是因为消耗0体力能搬运的体积维0。 $\\$(3)状态转移: $\\$就是一个简单的01背包问题,就不多做解释: $\\$$f[j] = max(f[j], f[j - tl[i]] + tj[i]);$ $\\$(4)结果输出: $\\$最后我们就可以判断用全部的体力(也就是$i==c$)是否能填平,如果不能,就输出“$Impossibel$”,不然就一直向下找,直到找到刚好够填平时消耗的体力,用总体力一减,就是答案了,
    代码
    
    #include<iostream>
    using namespace std;
    int v, n, c, tj[10002], tl[10002];
    int f[10002];
    int main()
    {
        cin >> v >> n >> c;
        for (int i = 1; i <= n; i++)
            cin >> tj[i] >> tl[i];
        for (int i = 1; i <= n; i++)
            for (int j = c; j >= tl[i]; j--)
                f[j] = max(f[j], f[j - tl[i]] + tj[i]);
        if (f[c] < v)
            cout << "Impossible";
        else
        {
            int i = c;
            while (f[i] >= v) i--;
            cout << c - (i + 1);
        }
        return 0;
    }
    
    
    • 1
      @ 2024-5-7 17:32:47

      炎帝出题让精卫填大海😄 : 思路: (1)状态定义: 定义f表示消耗i的体力最多可以搬运的体积(2)初始状态: 不需要特殊处理,嗯其实是因为消耗0体力能搬运的体积维0。(3)状态转移: 就是一个简单的01背包问题,就不多做解释fj]= max(fj],fj- tl{i]]+ tj[i]);(4)结果输出: 最后我们就可以判断用全部的体力(也就是i== c)是否能填平,如果不能,就输出"Impossibel",不然就一直向下找,直到找到刚好够填平时消耗的体力,用总体力一减,就是答案了 思路抄:

      #include <bits/stdc++.h>
      using namespace std;
      int v,n,c,ans=INT_MAX;
      struct R
      {
          int k,m;
      }q[10005];
      int sum=0;
      int f[10000000];
      int main()
      {
         cin>>v>>n>>c;
         for(int i=1;i<=n;i++)
         {
            cin>>q[i].k>>q[i].m;
            sum=max(q[i].k,sum);
         }
         sum+=v;
         for(int j=1;j<=sum;j++)
            f[j]=1e7; 
         f[0]=0;
         for(int i=1;i<=n;i++)
         {
            for(int j=sum;j>=q[i].k;j--)
            {
               f[j]=min(f[j],f[j-q[i].k]+q[i].m);
            }
         }
         for(int j=v;j<=sum;j++)
         {
            ans=min(f[j],ans);
         }
         if(ans>c)
            cout << "Impossible";
         else 
            cout<<c-ans;
          return 0;
      }
      
      • 0
        @ 2024-4-5 14:44:55

        思路点拨

        (搬过来的石头的体积和 以下简称总体积)

        1.总体积可以大于v。

        2.总体积不超过(v+max(k))大于这个值均不是最优方案。

        #include<bits/stdc++.h>
        using namespace std;
        int v,n,c,ans=INT_MAX;
        struct R
        {
            int k,m;
        }q[10005];
        int sum=0;
        int f[10000000];
        
        
        
        int main()
        {
            cin>>v>>n>>c;
            for(int i=1;i<=n;i++)
            {
                cin>>q[i].k>>q[i].m;
                sum=max(q[i].k,sum);
            }
            sum+=v;
            for(int j=1;j<=sum;j++)f[j]=1e7;
            
            f[0]=0;
            for(int i=1;i<=n;i++)
            {
                for(int j=sum;j>=q[i].k;j--)
                {
                    f[j]=min(f[j],f[j-q[i].k]+q[i].m);
                }
            }
            for(int j=v;j<=sum;j++)
            {
                ans=min(f[j],ans);
            }
            if(ans>c)cout<<"Impossible";
            else cout<<c-ans;
            return 0;
        }
        
        • -20
          @ 2023-9-23 21:24:11
          #include<iostream>
          using namespace std;
          int v, n, c, tj[10002], tl[10002];
          int f[10002];
          int main()
          {
              cin >> v >> n >> c;
              for (int i = 1; i <= n; i++)
                  cin >> tj[i] >> tl[i];
              for (int i = 1; i <= n; i++)
                  for (int j = c; j >= tl[i]; j--)
                      f[j] = max(f[j], f[j - tl[i]] + tj[i]);
              if (f[c] < v)
                  cout << "Impossible";
              else
              {
                  int i = c;
                  while (f[i] >= v) i--;
                  cout << c - (i + 1);
              }
              return 0;
          }
          
          
        • 1

        信息

        ID
        371
        时间
        1000ms
        内存
        256MiB
        难度
        3
        标签
        递交数
        465
        已通过
        268
        上传者