您的位置:首页 > 产品设计 > UI/UE

Codeforces 687C The Values You Can Make(DP)

2016-07-10 10:17 435 查看
题目大概说给n个各有价值的硬币,要从它们中选出若干个组合成面值k,而要求的是各个方案里这些选出的硬币能组合出来的面值有哪些。

有点绕。。

dp[i][j][k]表示前i个硬币中 能否 组合成面值j且选出的硬币能组合成面值k

转移要考虑全面。。三个方向转移,第i个不选、第i个选但不参与选出硬币去组合成k、第i个选且参与选出硬币去组成成k

#include<cstdio>
using namespace std;

bool d[555][555][555];
int main(){
int n,K,a;
scanf("%d%d",&n,&K);
d[0][0][0]=1;
for(int i=0; i<n; ++i){
scanf("%d",&a);
for(int j=0; j<=K; ++j){
for(int k=0; k<=K; ++k){
if(d[i][j][k]==0) continue;
d[i+1][j][k]=1;
if(j+a<=K){
d[i+1][j+a][k]=1;
if(k+a<=K){
d[i+1][j+a][k+a]=1;
}
}
}
}
}
int cnt=0;
for(int k=0; k<=K; ++k){
if(d
[K][k]){
++cnt;
}
}
printf("%d\n",cnt);
for(int k=0; k<=K; ++k){
if(d
[K][k]){
printf("%d ",k);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: