裝箱問題(NOIP競賽原題)(動態規劃)
阿新 • • 發佈:2019-02-09
/*
【2001年普及組4】裝箱問題
Time Limit:1000MS Memory Limit:65536K
Total Submit:512 Accepted:251
Description
有一個箱子容量為v(正整數,o≤v≤20000),同時有n個物品(o≤n≤30),每個物品有一個體積 (正整數)。要求從m個物品中,任取若千個裝入箱內,使箱子的剩餘空間為最小。
[樣例]
輸入:
24 一個整數,表示箱子容量
6 一個整數,表示有n個物品
8 接下來n行,分別表示這n個物品的各自體積。
3
12
7
9
7
輸出:
0 一個整數,表示箱子剩餘空間。
Input
第一行為箱子容量為v;第二行為物品數;以下n行分別為每個物品的體積;
Output
箱子剩餘空間
Sample Input
24
6
8
3
12
7
9
7
Sample Output
0
*//*
動態規劃,設:a[i,j] 表示選前i個物品剛好能裝滿 j 空間,則有:
a[i,j] = a[i-1][j] or a[i-1][j-v[i]] j>v[i]
a[i,0] = 0 ;
不過,這題有點特殊:
就是:
a[i,j]只與: i-1有關
所以可以降到一維...
*/
#include <stdio.h>
#include <string.h>#define MAX 20001int main(void)
{
int m,n,tv,v,i,j,k ;
int a[MAX] ={0} ;
a[0] =1;
scanf("%d",&v) ;
scanf("%d ",&n) ;
for(i=1 ; i<= n ; i++)
{
scanf("%d",&tv);
for(j=v ; j>=tv ; j--)
if(!a[j])
a[j] = a[j-tv] ;
}
m = v ;
while ( a[m] ==0)
m -- ;
printf("%d ",v-m) ;
return0 ;
}
【2001年普及組4】裝箱問題
Time Limit:1000MS Memory Limit:65536K
Total Submit:512 Accepted:251
Description
有一個箱子容量為v(正整數,o≤v≤20000),同時有n個物品(o≤n≤30),每個物品有一個體積 (正整數)。要求從m個物品中,任取若千個裝入箱內,使箱子的剩餘空間為最小。
[樣例]
輸入:
24 一個整數,表示箱子容量
6 一個整數,表示有n個物品
8 接下來n行,分別表示這n個物品的各自體積。
3
12
7
9
7
輸出:
0 一個整數,表示箱子剩餘空間。
Input
第一行為箱子容量為v;第二行為物品數;以下n行分別為每個物品的體積;
Output
箱子剩餘空間
Sample Input
24
6
8
3
12
7
9
7
Sample Output
0
動態規劃,設:a[i,j] 表示選前i個物品剛好能裝滿 j 空間,則有:
a[i,j] = a[i-1][j] or a[i-1][j-v[i]] j>v[i]
a[i,0] = 0 ;
不過,這題有點特殊:
就是:
a[i,j]只與: i-1有關
所以可以降到一維...
*/
#include <stdio.h>
#include <string.h>#define MAX 20001int main(void)
{
int m,n,tv,v,i,j,k ;
int a[MAX] ={0} ;
a[0] =1;
scanf("%d",&v) ;
scanf("%d
for(i=1 ; i<= n ; i++)
{
scanf("%d",&tv);
for(j=v ; j>=tv ; j--)
if(!a[j])
a[j] = a[j-tv] ;
}
m = v ;
while ( a[m] ==0)
m -- ;
printf("%d ",v-m) ;
return0 ;
}