c語言裝箱問題
Ⅰ c語言1000發子彈裝箱問題,如何編寫該程序
你可以用一個循環來給數組賦值,因為用的是手機,打字不好打,我就寫一下循環部分了吧,,,
for(i=2;i<=10;i
)
for(j=1;j<=i-1;j
)
a[i]=a[i]*2;,,注意數組我這里是11個元素,第一個元素沒用,後面剛好十個方便應用。然後數組一開始要初始化全為1
Ⅱ 【急】C語言的箱問題
這是動態規劃問題的典型問題
你可以搜一下動態規劃解決「裝箱問題」和「背包問題」,看一下思想就明白了。
祝順利解決。
【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 20001
int 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) ;
return 0 ;
}
Ⅲ c語言編程 裝箱子
#include<stdio.h>
#define n 1000
int main(void)
{ int a[n],b[n],i=0,j,x,max=1;
scanf("%d",&x);
for(i=1;i<=x;i++)
scanf("%d",&a[i]);
for(j=1;j<=100;j++)
b[j]=100;
for(i=1;i<=x;i++)
for(j=1;j<=100;j++)
{ if(b[j]-a[i]>=0)
{ printf("%d %d\n",a[i],j);
b[j]=b[j]-a[i];
if(max<j)
max=j;
break;}
}
printf("所需的箱子數目為%d\n",max);
return 0;
}
Ⅳ c語言1000發子彈裝箱問題,如何編寫該程序
你可以用一個循環來給數組賦值,因為用的是手機,打字不好打,我就寫一下循環部分了吧,,, for(i=2;i<=10;i )
for(j=1;j<=i-1;j )
a[i]=a[i]*2;,,注意數組我這里是11個元素,第一個元素沒用,後面剛好十個方便應用。然後數組一開始要初始化全為1
Ⅳ C語言的``裝箱問題
我運行沒問題。
#define N 100
main()
{
int sum, set, i, j, max, check[100];
int volume[N]={8,3,12,7,9,7}, n=6,_n, v=24;
/*scanf("%d", &v);
scanf("%d", &n);
for (i=1;i<=n;i++)
scanf("%d", &volume[i]);
max=0;
*/
set=1;
for (i=1;i<=n;i++)
set*=2; //計算2的N次方。
for (i=0;i<=set;i++)
{
for (j=1;j<=n;j++)
check[j]=0; //清空數組
j=i;
sum=1;
while (j>=1) //把數據轉換成二進制數制(1代表取,0代表不取)
{
check[sum]=j%2;
j/=2;
sum++;
}
sum=0; //計算該方案佔用的體積
for (j=1;j<=n;j++)
if (check[j]==1)
sum+=volume[j];
if ((sum<=v)&&(sum>=max)) //根據題意作比較
max=sum;
}
printf("%d",v-max); //輸出剩餘體積。
system("pause");
}
我確實運行沒問題。OK,0
Ⅵ 裝箱問題
有一個箱子容量為V(正整數,0<=V<=20000),同時有n個物品(0<n<=30,每個物品有一個體積(正整數)。
要求n個物品中,任取若干個裝入箱內,使箱子的剩餘空間為最小。
樣例
輸入:
24 一個整數,表示箱子容量
6 一個整數,表示有n個物品
8 接下來n行,分別表示這n 個物品的各自體積
3
12
7
9
7
輸出:0 一個整數,表示箱子剩餘空間。
# include <stdio.h>
# include <stdlib.h>
typedef struct ele
{ int vno;
struct ele *link;
} ELE;
typedef struct hnode
{ int remainder;
ELE *head;
struct hnode *next;
} HNODE;
void main()
{
int n, i, box_count, box_volume, *a;
HNODE *box_h, *box_t, *j;
ELE *p, *q;
printf("輸入箱子容積\n");
scanf("%d",&box_volume);
printf("輸入物品種數\n");
scanf("%d",&n);
a=(int *)malloc(sizeof(int)*n);
printf("請按體積從大到小順序輸入各物品的體積:");
for (i=0;i<n;i++) scanf("%d",a+i);
box_h=box_t=NULL;
box_count=0;
for (i=0;i<n;i++)
{ p=(ELE *)malloc(sizeof(ELE));
p->vno=i;
for (j=box_h;j!=NULL;j=j->next)
if (j->remainder>=a[i]) break;
if (j==NULL)
{ j=(HNODE *)malloc(sizeof(HNODE));
j->remainder=box_volume-a[i];
j->head=NULL;
if (box_h==NULL) box_h=box_t=j;
else box_t=box_t->next=j;
j->next=NULL;
box_count++;
}
else j->remainder-=a[i];
for (q=j->head ;q!=NULL&&q->link!=NULL;q=q->link);
/*q=j->next;q!=NULL&&q->link!=NULL;q=q->link*/
if (q==NULL)
{ p->link=j->head;
j->head=p;
}
else
{ p->link=NULL;
q->link=p;
}
}
printf("共使用了%d只箱子",box_count);
printf("各箱子裝物品情況如下:");
for (j=box_h,i=1;j!=NULL;j=j->next,i++)
{ printf("第%2d只箱子,還剩餘容積%4d,所裝物品有;\n",i,j->remainder);
for (p=j->head;p!=NULL;p=p->link)
printf("%4d",p->vno+1);
printf("\n");
}
}