下午T2求思路

求思路



现在的定义:
dp[i]表示选i个数时大于等于m的最小数之和;
不会转移

01背包会吗?

嗯,所以?

就是01背包,可以超出的那种

f[0]=true;
for(int i=1;i<=n;i++){
  for(int j=m-1;j>=0;j--){
     f[j+a[i]]=f[j+a[i]]|f[j];
  }
}

哦…啥也不会的我沉默了

还有人吗?这个啥意思“|” ?

就是或的意思呀

设当前数为 a_i ,若 j 可以到达,那 j+a_i 肯定也能到达

就这么写?那赋的那个值呀?

f 是 bool 类型啊

@郭子路 对了,记得特判,如果所有数的总和小于 m 就输出 -1

嗯嗯,谢谢

桑,咱俩写法好像不太一样

for(int i=1;i<=n;++i){
	scanf("%d",&s),cnt+=s;
	for(int j=cnt;j>=s;--j)f[j]=f[j-s]|f[j];
}

我是这么写的

也可以