2 solutions

  • 1
    @ 2024-3-24 21:02:39
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,Alv,Ans=1e9,Tot,Opt[100005];
    int main(){
        #ifndef ONLINE_JUDGE
        freopen("prob.in","r",stdin);
        freopen("prob.out","w",stdout);
        #endif
        scanf("%d%d",&n,&Alv);Tot=Alv*2;
        memset(Opt,63,sizeof(Opt));Opt[0]=0;
        for(int i=1;i<=n;i++){
            int V,p;scanf("%d%d",&V,&p);
            for(int j=V;j<=Tot;j++)
            Opt[j]=min(Opt[j-V]+p,Opt[j]);
        }
        for(int i=Alv;i<=Tot;i++) Ans=min(Opt[i],Ans);
        printf("%d\n",Ans);
        return 0;
    }
    
    • 1
      @ 2024-3-23 16:29:05

      [USACO08NOV] Buying Hay S

      题意

      知道各个货品和最大价值最小的大小,反求背包最小容量。

      题解

      用二分法求背包最小容量,具体见代码:

      #include<bits/stdc++.h>
      using namespace std;
      int m,n;//m最大价值最小的大小,n货品数量
      int w[105],C[105];//w存货品大小,C存货品价值
      int dp[50005];
      int main(){
      	cin>>n>>m;
      	for(int i=0;i<n;i++){
      		cin>>C[i]>>w[i];
      	}
      	int l=0,r=100000;
      	while(l<r){//二分
      		int mid=(l+r)/2;//假设背包容量为mid
      	    for(int i=1;i<=n;i++){
      		    for(int c=1;c<=mid;c++){
      			    if(w[i-1]<=c)
      			    dp[c]=max(dp[c],dp[c-w[i-1]]+C[i-1]);
      		    }
      	    }//dp算出最大价值
      	    if(dp[mid]<m)//如果最大价值小于m
      	    l=mid+1;//更新区间
      	    else
      	    r=mid;//更新区间
      	}
      	cout<<l;//输出背包容量
      	return 0;
      }
      

      点赞!!!

      • @ 2024-3-23 16:38:09

        二分好评!!!!!!!!!!!!!!!

    • 1

    Information

    ID
    1027
    Time
    1000ms
    Memory
    125MiB
    Difficulty
    6
    Tags
    # Submissions
    26
    Accepted
    11
    Uploaded By