2346 - 装箱问题

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 125 MB

有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。

要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

<br />

题目输入

每个测试文件只包含一组测试数据,每组输入的第一行为一个整数V(0<=V<=20000),表示箱子的容量。

第二行输入一个整数n(0<n<=30),表示有n个物品。

接下来n行,每行输入一个正整数,表示每个物品的体积。


题目输出

对于每组输入数据,输出一个整数,表示箱子剩余空间。


输入/输出样例

输入格式

24
6
8
3
12
7
9
7

输出格式

0

C语言解答

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

C++解答

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int main(){
int V,n,w[35],f[20005];
cin>>V>>n;
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<=n;i++){
for(int j=V;j>=w[i];j--){
f[j]=max(f[j],f[j-w[i]]+w[i]);
}
}
cout<<V-f[V]<<endl;
return 0;
}

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;
			}
		}
	}
}

Python解答

# coding=utf-8
def main():
    V = int(input())
    n = int(input())
    vv = []
    for _ in range(n):
        vv.append(int(input()))

    dp = [[0 for _ in range(V+1)] for _ in range(n)]
    for i in range(n):
        for j in range(1, V+1):
            if i == 0:
                if j - vv[i] >= 0:
                    dp[i][j] = vv[i]
            else:
                if j - vv[i] >= 0:
                    dp[i][j] = max(dp[i-1][j], dp[i-1][j - vv[i]] + vv[i])
                else:
                    dp[i][j] = dp[i-1][j]
    print(int(V - dp[n-1][V]))

if __name__ == '__main__':
    main()