生活随笔
收集整理的這篇文章主要介紹了
回溯法---子集和
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://blog.csdn.net/hustspy1990/article/details/6275725
/*
回溯法-子集和數問題
*/
#include <stdio.h>
int M,n;
int w[100];
int x[100];
void SumOfSub(int s, int k, int r)//w數組必須是遞增的
{//s=w[1]*x[1]+...+w[k-1]*x[k-1]//r=w[k]+...w[n] //w[i]需要按非降次序排列 int i;x[k]=1;for(i=1; i<=k; i++)printf("%d", x[i]);printf("/n");if(s+w[k]==M) //子集找到{printf("ans:");for(i=1; i<=k; i++)printf("%d", x[i]);printf("/n");}else if(s+w[k]+w[k+1]<=M)SumOfSub(s+w[k], k+1, r-w[k]);if(s+r-w[k]>=M && s+w[k+1]<=M)//當在什么情況下可以不選擇w[k]而也能找到子集?{x[k]=0;SumOfSub(s, k+1, r-w[k]);}
}
int main()
{int s,k,r;n=4;w[1]=7;w[2]=11;w[3]=13;w[4]=24;M=31;s=0;k=1;r=55;SumOfSub(s, k, r);getchar();return 0;
}
可以看成背包問題,但是只能求出一個解。數組元素當成是物品,物品的價值與重量是元素的值,背包的容量是T;
總結
以上是生活随笔為你收集整理的回溯法---子集和的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。