1. 程式人生 > 其它 >【PTA】實驗7-1-13 裝箱問題

【PTA】實驗7-1-13 裝箱問題

技術標籤:PTAC語言程式設計

紀念品分組
用雙指標做這個題的時候想到了這個裝箱問題.
傳送門
假設有N項物品,大小分別為s​1、s2 、…、si​​ 、…sN
​​ ,其中si為滿足1≤si≤100的整數。要把這些物品裝入到容量為100的一批箱子(序號1-N)中。裝箱方法是:對每項物品, 順序掃描箱子,把該物品放入足以能夠容下它的第一個箱子中。請寫一個程式模擬這種裝箱過程,並輸出每個物品所在的箱子序號,以及放置全部物品所需的箱子數目。

輸入格式:
輸入第一行給出物品個數N(≤1000);第二行給出N個正整數si(1≤si≤100,表示第i項物品的大小)。

輸出格式:
按照輸入順序輸出每個物品的大小及其所在的箱子序號,每個物品佔1行,最後一行輸出所需的箱子數目。

輸入樣例:

8
60 70 80 90 30 40 10 20

輸出樣例:

60 1
70 2
80 3
90 4
30 1
40 5
10 1
20 2
5

細節解決
①為了顯示已經裝箱的物品,裝箱標號後,把該物品的重量改成101(大於100的數字)
②上述物品重量已經改變,而輸出時需要輸出原有重量,那麼就需要開一個額外的陣列c記錄原來的重量.

#include<stdio.h>
int a[1001],b[1001],c[1001],i,j,w=0,cnt=0,n;
int main()
{
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d"
,&a[i]),c[i]=a[i]; for(i=0;i<n;i++) { if(a[i]<=100) cnt++,w=a[i],b[i]=cnt; for(j=i+1;j<n;j++) { if(w+a[j]<=100) w+=a[j],b[j]=cnt,a[j]=101; } } for(i=0;i<n;i++) printf("%d %d\n",c[i],b[i]); printf("%d",cnt); }

這是我初學時做的:

#include<stdio.h>
int
main() { int a[1001],b[1001],i,j,k=1,x,n,flag=1,c[1001],max=0,index; for(i=1;i<=1000;i++) b[i]=0; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=n;i++) { k=1;flag=1; while(flag) { if((b[k]+a[i])<=100) {flag=0;b[k]=b[k]+a[i];c[i]=k;} k++; } } index=1; for(i=1;i<=n;i++) if(c[i]>c[index]) index=i; for(i=1;i<=n;i++) printf("%d %d\n",a[i],c[i]); printf("%d",c[index]); }