标签:
http://privateoj.cnuschool.org.cn/oj/home/problem.htm?problemID=2104
题的网址
没什么好解释的,用DFS= =
最开始记着把f数组下标0的数值设为1,变量op记和。
#include<cstdio> using namespace std; int c[5],d[5],s,tot; long long f[1000001]={1},t; void dfs(int now,int num,int op) { if(op<0) return; if(now==5) { if(num&1) t-=f[op]; else t+=f[op]; return; } dfs(now+1,num,op); dfs(now+1,num+1,op-(d[now]+1)*c[now]); } int main() { scanf("%d%d%d%d%d",&c[1],&c[2],&c[3],&c[4],&tot); for(int i=1;i<=4;i++) { for(int j=c[i];j<=1000000;j++) f[j]+=f[j-c[i]]; } for(int i=0;i<tot;i++) { scanf("%d%d%d%d%d",&d[1],&d[2],&d[3],&d[4],&s); t=0; dfs(1,0,s); printf("%lld\n",t); } return 0; }
有什么不懂评论吧。。。。估计没学过DFS看不懂。。。。学过DFS都能看懂。
标签:
原文地址:http://www.cnblogs.com/scx2015noip-as-php/p/ZYH2015081003.html