1 solutions

  • 0
    @ 2025-11-5 15:00:30

    C :

    #include<stdio.h>
    int v,n,i,j,k,a[31];
    int f[20001];
    int main()
    {
        scanf("%d%d",&v,&n);
        for(i=1;i<=n;i++)
    		scanf("%d",&a[i]);
        f[0]=1;
        for(i=1;i<=n;i++)
            for(j=v;j>=a[i];j--)
                if(!f[j]&&f[j-a[i]])
    				f[j]=1;
        k=v;
        for(;k>1&&!f[k];k--);
        printf("%d\n",v-k);
    	return 0;
    }
    

    C++ :

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<ctime>
    #include<cmath>
    #include<string>
    #include<cstdio>
    using namespace std;
    
    int a[35], n, res;
    
    void dfs(int k, int V)
    {
        if(V < res) res = V;
        if(k == n) return;
        dfs(k+1, V);
        if(V >= a[k])
            dfs(k+1, V-a[k]);
    }
    
    int main()
    {
        int V;
        cin>>V>>n;
        for(int i = 0; i < n; ++i)
            cin>>a[i];
        res = V;
        dfs(0, V);
        cout<<res<<endl;
        return 0;
    }
    
    

    Pascal :

    var f:array[0..20000]of boolean;
    v,m,i,j,o,max:longint;
    begin
      //assign(input,'boxes.in'); reset(input);
      //assign(output,'boxes.out'); rewrite(output);
      readln(v);
      readln(m);
      f[0]:=true;
      for i:=1 to m do begin
        readln(o);
        for j:=v downto 0 do if (j+o<=v)and(f[j]) then f[j+o]:=true;
      end;
      for j:=0 to v do if f[j] then max:=j;
      writeln(v-max);
      //close(output);
    end.
    

    Java :

    import java.util.*;
    
    public class Main {
    	public static void main(String[] args){
    		int v;
    		int n;
    		int[] a;
    		Scanner sc= new Scanner(System.in);
    		while(sc.hasNext()){
    			v=sc.nextInt();
    			n=sc.nextInt();
    			a=new int[n];
    			for(int i=0;i<n;i++)
    				a[i]=sc.nextInt();
    			int result=inornot(a,0,v);
    			System.out.println(result);
    		}
    		sc.close();
    	}
    	public static int inornot(int[] a,int i,int v){
    		if(i>=a.length)
    			return v;
    		else{
    			if(a[i]>v){
    				return inornot(a,i+1,v);
    			}
    			else{
    				int n=v-a[i];
    				int m=inornot(a,i+1,n);
    				int k=inornot(a,i+1,v);
    				if(m<k)
    					return m;     
    				else
    					return k;
    			}
    		}
    	}
    }
    
    • 1

    Information

    ID
    16318
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By