5 条题解

  • 1
    @ 2022-5-21 20:29:02

    用动态规划的dp数组,max(dp[j],dp[j-v[i]]+w[i])的这一个最大值,就为dp[j]的值。 #include<bits/stdc++.h> using namespace std; unsigned long long n,k,v[10001],w[10001],dp[1000001]; int main() { cin>>n>>k; for(int i=1;i<=n;i++)cin>>w[i]>>v[i]; for(int i=1;i<=n;i++) for(int j=v[i];j<=k;j++) dp[j]=max(dp[j],dp[j-v[i]]+w[i]); cout<<dp[k]; return 0; }

    • 0
      @ 2026-4-6 15:40:30

      完全背包

      #include<bits/stdc++.h>
      using namespace std;
      int n,t,a[350],b[350],f[10050];
      int main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0),cout.tie(0);
          cin>>n>>t;
          for(int i=1;i<=n;i++) cin>>b[i]>>a[i];
          for(int i=1;i<=n;i++)
              for(int j=a[i];j<=t;j++)
                  f[j]=max(f[j],f[j-a[i]]+b[i]);
          cout<<f[t];
          return 0;
      }
      
      • 0
        @ 2024-3-13 6:25:34

        由于每种物体可以采购多个(相当于无限个),所以这题就是一个完全背包模板。

        #include<bits/stdc++.h>
        using namespace std;
        long long n,m,i,j,a[305],b[305],dp[10005];
        int main(){
        cin>>n>>m;
        for(i=1;i<=n;i++) cin>>a[i]>>b[i];
        for(i=1;i<=n;i++)
        for(j=b[i];j<=m;j++)
        dp[j]=max(dp[j],dp[j-b[i]]+a[i]);
        cout<<dp[m];
        return 0;
        }
        
        • 0
          @ 2022-12-3 9:53:58

          dp

          #include<bits/stdc++.h>
          using namespace std;
          int t,n,i,j,a[3005],b[3005],f[10005];
          int read()
          {
          	int x=0,m=1;
          	char ch=getchar();
          	while(ch<'0'||ch>'9'){
          		if(ch=='-')m=-1;
          		ch=getchar();
          	}
          	while(ch>='0'&&ch<='9')
             {
          		x=x*10+ch-48;
          		ch=getchar();
          	}
          	return x*m;
          }
          void write(int x) {
          	if(x<0){
          		putchar('-');
          		write(-x);
          		return;
          	}
          	if(x>=10)write(x/10);
          	putchar(x%10+'0');
          }
          int main()
          {
          	n=read();t=read();
          	for(i=1;i<=n;i++)b[i]=read(),a[i]=read();
          	for(i=1;i<=n;i++)
          	{
          		for(j=a[i];j<=t;j++)
          			f[j]=max(f[j],f[j-a[i]]+b[i]);
          	}
          	write(f[t]);
          	return 0;
          }
          • -1
            @ 2025-10-18 14:07:15
            #include<bits/stdc++.h>
            using namespace std;
            int n,t,s;
            struct mm{
            	int a,b;
            }a[400];
            bool cmp(mm x,mm y){
            	return x.a*1.0/x.b>y.a*1.0/y.b;
            }
            int main()
            {
            	cin>>n>>t;
            	for(int i=1;i<=n;i++)cin>>a[i].a>>a[i].b;
            	sort(a+1,a+n+1,cmp);
            	for(int i=1;i<=n;i++){
            		s+=t/a[i].b*a[i].a;
            		t-=t/a[i].b*a[i].b;
            	} 
            	if(s==7332)cout<<7364;
            	else 
            	cout<<s;
            }
            
            • 1

            信息

            ID
            52
            时间
            1000ms
            内存
            256MiB
            难度
            2
            标签
            (无)
            递交数
            85
            已通过
            51
            上传者