【bzoj2287】【POJ Challenge】消失之物
2016-06-21 21:07
295 查看
题目
O(n*m)的背包可以求出用所有物品达到i容量的方案数,
我们可以考虑从其中减掉每种物品的方案得到答案。
由原来的方程f[i]+=f[j](j=i-v[i]) 此时的f[j]未用i物品更新过。
我们从前向后减去每个f[i]对应的f[j],在枚举到i时对应的j已经不包含第i个物品,
直接减掉就可以了。
代码:
#include<cstdio>
#define maxn 2010
using namespace std;
int n,m,f[maxn],g[maxn],w[maxn];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
}
f[0]=1;
for(int i=1;i<=n;i++){
for(int j=m;j>=w[i];j--){
f[j]+=f[j-w[i]];
if(f[j]>=10) f[j]-=10;
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++) g[j]=f[j];
for(int j=w[i];j<=m;j++){
g[j]-=g[j-w[i]];
g[j]=(g[j]%10+10)%10;
}
for(int j=1;j<=m;j++) printf("%d",g[j]);
puts("");
}
return 0;
}
O(n*m)的背包可以求出用所有物品达到i容量的方案数,
我们可以考虑从其中减掉每种物品的方案得到答案。
由原来的方程f[i]+=f[j](j=i-v[i]) 此时的f[j]未用i物品更新过。
我们从前向后减去每个f[i]对应的f[j],在枚举到i时对应的j已经不包含第i个物品,
直接减掉就可以了。
代码:
#include<cstdio>
#define maxn 2010
using namespace std;
int n,m,f[maxn],g[maxn],w[maxn];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
}
f[0]=1;
for(int i=1;i<=n;i++){
for(int j=m;j>=w[i];j--){
f[j]+=f[j-w[i]];
if(f[j]>=10) f[j]-=10;
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++) g[j]=f[j];
for(int j=w[i];j<=m;j++){
g[j]-=g[j-w[i]];
g[j]=(g[j]%10+10)%10;
}
for(int j=1;j<=m;j++) printf("%d",g[j]);
puts("");
}
return 0;
}
相关文章推荐
- 【算法系列】插入排序算法
- RxJava 笔记-1
- 人生
- leetcode题解日练--2016.6.21
- c /c++中日期和时间的获取:strftime()函数
- linux 下echo命令写入文件内容
- 爱奇艺VIP云解析接口
- Missing Number
- 设计模式整理_迭代器模式
- CSS3制作简单动画
- jQuery获取单选按钮(Radio)当前选中项的值
- IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解
- C# 字典 Dictionary 遍历
- java 输入一个链表,反转链表后,输出链表的所有元素。
- 该日在本年第几天
- json解析utils
- ViewPagerIndicator(ViewPager指示器)
- 学习笔记4
- 文件下载时乱码问题
- Activity的flags和task总结