6 条题解

  • 2
    @ 2024-4-27 17:44:35
    #include <bits/stdc++.h>
    using namespace std;
    int n , m , j , k = 20000000;
    const int MAXN = 100000;
    int a[MAXN] , b[MAXN] , c[MAXN] , f[MAXN];
    int main()
    {
    	cin >> n >> m;
    	int m1 = m + 5000;
    	for(int i = 1 ; i <= n ; i++)
    	{
    		cin >> a[i] >> b[i];
    	}
    	for(int i = 1 ; i <= m1 ; i++)
    	{
    		c[i] = 20000005;//定义一个很大的数从而去找哪个最小的数
    	}
    	for(int i = 1 ; i <= n ; i++)
    	{
    		for(int j = a[i] ; j <= m1 ; j++)
    		{
    			c[j] = min(c[j] , c[j - a[i]] + b[i]);//找出最小的开销
    		}
    	}
    	for(int i = m ; i <= m1 ; i++)
    	{
    		k = min(k , c[i]);
    	}
    	cout << k;
    	return 0;
    }
    
    • 2
      @ 2024-4-26 20:47:07

      ***一定要耐心看完!👀️ ***

      咱就是说啊,诶算了不说了 以下加密版本啊(0写成O


      #include<bits/stdc++.h> using namespace std; const int N=1O5; const int M=55OO5; int n,h,p[N],c[N],d[M]; int main() { cin>>n>>h; for(int i=1;i<=n;i++) { cin>>p[i]>>c[i]; } memset(dp,63,sizeof(d)); d[O]=O; for(int i=1;i<=n;i++) { for(int j=p[i];j<=h+5OOO;j++) { d[j]=min(d[j],d[j-p[i]]+c[i]); } } int ans=1OOOOOOOOO; for(int i=h;i<=h+5OOO;i++) { ans=min(ans,d[i]); } cout<<ans; return O; }


      算了不开玩笑了

      #include<bits/stdc++.h>
      using namespace std;
      const int N=105;
      const int M=55005;
      int n,h,p[N],c[N],dp[M];
      int main()
      {
          cin>>n>>h;
          for(int i=1;i<=n;i++)
          {
              cin>>p[i]>>c[i];
          }
          memset(dp,63,sizeof(dp));
          dp[0]=0;
          for(int i=1;i<=n;i++)
          {
              for(int j=p[i];j<=h+5000;j++)
              {
                  dp[j]=min(dp[j],dp[j-p[i]]+c[i]);
              }
          }
          int ans=1000000000;
          for(int i=h;i<=h+5000;i++)
          {
              ans=min(ans,dp[i]);
          }
          cout<<ans;
          return 0;
      }
      
      
      • 2
        @ 2023-8-20 18:47:31
        思路 这道题的基本思路就是完全背包,所以转移方程非常简单: $\\f[j]=min(f[j],f[j-p[i]]+c[i]);$ $\\$难点在于结果输出,当重量大于等于h,小于等于h与价格最大值的和时,最小值都有可能出现,不仅存于重量等于h时! $\\$最终答案在f[h]到f[h+5000]中间寻找,是考虑有可能买更多的干草包但花费的钱却更小,只需加上单个开销的最大值即可。
        代码
        
        #include<iostream>
        using namespace std;
        #define INF 1e9
        int n,h,f[55000],ans,p[105],c[105];
        int main()
        {
        	for (int i=1;i<=55000;i++)
        		f[i]=INF;
            cin>>n>>h;
            for(int i=1;i<=n;i++)
        		cin>>p[i]>>c[i];
            for(int i=1;i<=n;i++)
                for(int j=p[i];j<=h+5000;j++)
                    f[j]=min(f[j],f[j-p[i]]+c[i]);
            for(int i=h;i<=h+5000;i++)
        		ans=min(ans,f[i]);
            cout<<ans;
        	return 0;
        }
        
        
        • 1
          @ 2024-5-5 19:59:54

          ~~哦嘞嘞!哦啦啦!~~本题有亿点难,

          这道题就是个完全背包问题,转移方程 is:fj]= min(f[j], f[j - p]]+ c]);(懒得写,从老师那抄的方程)😄 。

          本题难点在于结果输出,重量大于等于h时并且小于等于h与价格最大值的和时,最小值都能出现!最终答案一 、一 、一定在f[h]~f[h+5000]中间寻找。别的按课中老师讲的做就OK了!

          其实不是很难😄

          #include <bits/stdc++.h>
          using namespace std;
          int n,m,y = 20000000;
          const int MAXN = 100000;
          int a[MAXN] , b[MAXN] , f[MAXN];
          int main()
          {
          	cin >> n >> m;
          	int m1 = m + 5000;
          	for(int i = 1;i <= n;i++)
          	{
          		cin >> a[i] >> b[i];
          	}
          	for(int i = 1;i <= m1;i++)
          	{
          		f[i] = 20000005;
          	}
          	for(int i = 1;i <= n;i++)
          {
          		for(int j = a[i];j <= m1;j++)
          		{
          			f[j] = min(f[j],f[j - a[i]] + b[i]);
          		}
          	}
          	for(int = m;i <= m1;i++)
          	{
          		y = min(y,f[i]);
          	}
          	cout << y;
          	return 0;
          }
          
          
          • -2
            @ 2024-1-7 18:11:13
            #include <bits/stdc++.h>
            #define ll long long
            #define endl "\n"
            using namespace std;
            int n, h, v[105], w[105], f[55005], ans = 0x3f3f3f3f;
            int main()
            {
                ios::sync_with_stdio(false);
                cin.tie(0);
                cin >> n >> h;
                for (int i = 1; i <= n; i++)
                {
                    cin >> w[i] >> v[i];
                }
                memset(f, 0x3f, sizeof(f));
                f[0] = 0;
                for (int i = 1; i <= n; i++)
                {
                    for (int j = w[i]; j <= h + 5000; j++)
                    {
                        f[j] = min(f[j], f[j - w[i]] + v[i]);
                    }
                }
                for (int i = h; i <= h + 5000; i++)
                {
                    ans = min(ans, f[i]);
                }
                cout << ans;
                return 0;
            }
            
            • -2
              @ 2024-1-5 18:28:33
              #include<bits/stdc++.h>
              using namespace std;
              const int N=105;
              const int M=55005;
              int n,h,p[N],c[N],dp[M];
              int main()
              {
                  cin>>n>>h;
                  for(int i=1;i<=n;i++)
                  {
                      cin>>p[i]>>c[i];
                  }
                  memset(dp,63,sizeof(dp));
                  dp[0]=0;
                  for(int i=1;i<=n;i++)
                  {
                      for(int j=p[i];j<=h+5000;j++)
                      {
                          dp[j]=min(dp[j],dp[j-p[i]]+c[i]);
                      }
                  }
                  int ans=1000000000;
                  for(int i=h;i<=h+5000;i++)
                  {
                      ans=min(ans,dp[i]);
                  }
                  cout<<ans;
                  return 0;
              }
              
              • 1

              信息

              ID
              387
              时间
              1000ms
              内存
              256MiB
              难度
              5
              标签
              (无)
              递交数
              460
              已通过
              193
              上传者