4 条题解

  • 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
      @ 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
          标签
          (无)
          递交数
          79
          已通过
          46
          上传者