1. 程式人生 > >藍橋杯 裝箱問題

藍橋杯 裝箱問題

  演算法訓練 裝箱問題   時間限制:1.0s   記憶體限制:256.0MB 錦囊1 動態規劃。 錦囊2 用F[i,j]表示前i個物品裝j的容量是否可以,則F[i,j]=F[i-1,j-a[i]]||F[i-1,j]。其中a[i]表示第i個物品的體積。 問題描述   有一個箱子容量為V(正整數,0<=V<=20000),同時有n個物品(0<n<=30),每個物品有一個體積(正整數)。
  要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。 輸入格式   第一行為一個整數,表示箱子容量;
  第二行為一個整數,表示有n個物品;
  接下來n行,每行一個整數表示這n個物品的各自體積。 輸出格式   一個整數,表示箱子剩餘空間。 樣例輸入 24
6
8
3
12
7
9
7 樣例輸出 0

解題報告:這是一個揹包問題的變形。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max(x,y)  ((x)>(y)?(x):(y))
int dp[20000];
int main()
{
 	int v,n;
 	
 	scanf("%d%d",&v,&n);
 	int i,j;
 	memset(dp,-100,sizeof(dp));
 	dp[0]=0;//注意這是關鍵
 	for(i=0;i<n;i++)
 	{
       int a;
       scanf("%d",&a);
 	   for(j=v;j>=a;j--)
       dp[j]=max(dp[j],dp[j-a]+a);
    }
    for(i=v;i>=0;i--)
        if(dp[i]>0)
           break;
    printf("%d\n",v-i);
    //system("pause");
    return 0;
}