您的位置:首页 > 其它

UVA 11137 - Ingenuous Cubrency

2012-05-07 19:51 381 查看
这道题想错了方向,一直纠结于背包运行过程中忽略了一些情况,比如:要选8这个物品,当体积是8的时候我选了一个,因为存在价值为1这样的物品,这就是一种情况,但是当容量是16的时候,因为是完全背包,我又要选一个8,也就是覆盖了前面的f[8],因此我怎样去记录最终组合的种数呢?比如我给的容量就是16:那么会有两种情况8×1+1×8,2×8;但实现起来却是很不容易;

换个思路:我们设f[i]表示组成i面值的种数,则f[j] = f[j] + f[j-w[i]];相当于如果当前值j>w[i]的话,我们就选这个面值,因为有面值一的存在,必成立,又多了f[j-w[i]]种情况。

#include<stdio.h>
#include<string.h>
#define MAXN 10000 + 10

long long f[MAXN];
int n, w[22];
void solve()
{
memset(f,0,sizeof(f));
f[0]= 1;
for(int i = 1; i < 22; i ++)
w[i] = i * i * i;
for(int i = 1; i < 22; i ++)
{
for(int j = w[i]; j <= 10000; j ++)
{
f[j] += f[j-w[i]];
}
}
}
int main()
{
solve();
while(~scanf("%d",&n))
printf("%lld\n",f
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: