Problem Description
简单的背包问题。设有一个背包,可以放入的重量为s。现有n(n<=10)件物品,重量分别为w1,w2,...,wn,均为正整数,从n件物品中挑选若干件,使得放入背包的重量之和正好为s。找到一组解即可。如果找不到输出“not found”。
Input
输入有多组数据,每组数据的第1行是物品总件数和背包的载重量,第2行为各物品的重量。
Output
对于每组数据输出各所选物品的序号和重量。
Sample Input
5 10 1 2 3 4 5
Sample Output
number:1 weight:1 number:4 weight:4 number:5 weight:5
//关键字: 从后往前进行递归
//标程:
#include<stdio.h> #include<string.h> int p[15],n,vis[15],a[15],flag; long m; void dfs(long sum) { if(flag) return ; if(sum==m) { for(int j=1;j<=n;j++) if(a[j]) printf("number:%d weight:%d\n",j,a[j]); flag=1; return ; } for(int i=n;i>=1;i--) { if(!vis[i]) { vis[i]=1; a[i]=p[i]; dfs(sum+p[i]); a[i]=0; vis[i]=0; } } } int main() { // freopen("a.txt","r",stdin); int i,j; while(scanf("%d%d",&n,&m)!=EOF) { memset(vis,0,sizeof(vis)); memset(a,0,sizeof(a)); for(i=1;i<=n;i++) scanf("%d",&p[i]); flag=0; dfs(0); if(flag==0) printf("not found\n"); } return 0; }