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");
}
}