编程题--装满篮子

2 装满篮子

假设一个篮子最大载重为W,要求从多个不同重量物品中挑选出部分,使得其重量之和刚好等于W。

输入若干个正整数,其中第一个数值为篮子载重,后面若干个数值表示不同物品的重量,请判断是否存在方案能刚好装满篮子,存在装满篮子的方案输出YES,并按照输入顺序输出装满篮子的物品重量,以空格隔开;若不存在则输出NO。

备注:本题中只存在一种装满方案。

理解为背包问题:

C语言代码:

#include<stdio.h>

 

void main()

{

         int i,j,data[100],backet[100],k=0,w,m[100][100];

        

         while(scanf("%d",&data[k])!=EOF)  //输入ctrl+z停止输入

         {k++;}

 

         w=data[0];  //篮子总重量

         int n=k-1;

 

         for (i=1;i<k;i++)

         {

                   backet[i-1]=data[i];  //k-1个物品的重量

         }

 

        

         for(i=0;i<=n;i++)

         {

                   for(j=0;j<=w;j++)

                   {

                            m[i][j]=0;

                   }

         }

 

         for(i=1;i<=n;i++)

         {

                   for(j=1;j<=w;j++)

                   {

                            if(j>=backet[i-1])

                            {

                                     if(m[i-1][j]<m[i-1][j-backet[i-1]]+backet[i-1])

                                     {

                                               m[i][j] = m[i-1][j-backet[i-1]]+backet[i-1];

                                     }

                                     else

                                     {

                                               m[i][j] = m[i-1][j];

                                     }                

                            }

                            else

                            {

                                     m[i][j] = m[i-1][j];

                            }

                   }

         }

 

         if (m[n][w]==w)

         {

                   printf("YES");

         }

         else

         {

                   printf("NO");

         }

                           

}

posted on 2016-09-06 17:55  jh.ding  阅读(462)  评论(0编辑  收藏  举报