OpenJudge 2755
2755:神奇的口袋
- Time Limit:
- 10000ms
- Memory Limit:
- 65536kB
- Description
- 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。
- Input
- 输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出a1,a2……an的值。
- Output
- 输出不同的选择物品的方式的数目。
- Sample Input
-
3 20 20 20
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465//动态规划
#include<stdio.h>
#include<string.h>
int
main()
{
int
n,i;
int
num[50],a[30];
scanf
(
"%d"
,&n);
for
(i=0;i<n;i++)
scanf
(
"%d"
,&a[i]);
memset
(num,0,
sizeof
(num));
for
(i=0;i<n;i++)
{
int
k=40-a[i];
while
(k>=0)
{
if
(num[k]>0)
num[k+a[i]]+=num[k];
k--;
}
num[a[i]]++;
}
printf
(
"%d\n"
,num[40]);
return
0;
}
//AC,自己写的
#include <iostream>
#include <cstdlib>
#include <cstring>
using
namespace
std;
int
ch[25];
bool
vis[25];
int
ans,T;
//Èç¹ûÈ«¾ÖÉùÃ÷Ϊcount£¬Ôò×ÜÌáʾundeclared£¬»»Á˾ͺÃÀ²£¬²»¶®£¡
void
dfs(
int
cute,
int
j)
{
int
i,k;
if
(0==cute)
ans++;
else
{
for
(i=j;i<T;i++)
if
(!vis[i])
{
vis[i] =
true
;
dfs(cute-ch[i],i+1);
vis[i] =
false
;
}
}
}
int
main()
{
int
i,j,k;
cin>>T;
memset
(ch,0,
sizeof
(ch));
memset
(vis,
false
,
sizeof
(vis));
for
(i=0;i<T;i++)
cin>>ch[i];
ans = 0;
dfs(40,0);
cout<<ans<<endl;
//system("pause");
return
0;
}
1
作者:火星十一郎
本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步