Description
吳奶奶有個可愛的外孫女——琪琪,她很喜歡小動物,尤其喜歡養魚。為了讓小孫女養到漂亮的小魚,吳奶奶一大早就到花鳥魚蟲市場買魚。這個市場可真大,裡面有各種各樣的寵物,就連寵物魚都有好幾十種。這些魚實在是太美了,買的人越來越多,可是因為貨源有限,賣魚的老闆不得不規定:同一種魚,每個人最多隻能買一條,並且有些魚是不能一起買的,因為它們之間會互相爭鬥吞食。 吳奶奶想儘可能地買多些魚,但可惜,她的資金有限,這可怎麼辦好呢?請編寫一個程式協助她。如果有多個方案都能買到儘可能多的魚,則選擇所花資金最多的一個。
Input
輸入檔案的第一行為兩個正整數M(M≤1000),N(N≤30),分別表示吳奶奶的資金和魚的種類。以下N行,每行有兩個正整數S(1≤S≤N),T,分別表示某種魚的編號以及該魚的價格。 接著,每行有兩個整數P,Q。當P,Q大於0時,表示P,Q不能共處;當P,Q均等於0時,表示輸入檔案的結束。
Output
檔案的第一行為兩個正整數X,Y,分別表示所買魚的條數和總花費。
Sample Input
170 71 702 503 304 405 40 6 307 201 41 73 43 55 76 70 0
Sample Output
4 160
其實就是0/1背包,加上一些限制條件,可以用搜尋AC的
下面是AC代碼:
#include<iostream>using namespace std;int need[100];//int s[100],t[100];int f[100][100];int ans,i,l=0,n,m,num;int hash[100];int ansh[100];void dfs(int cur,int sum,int fish){int thash[31];if(cur>n){if(num<fish||(num==fish&&sum>ans)){num=fish;ans=sum;/*for(i=1;i<=n;i++){ansh[i]=hash[i];}*/}return ;} if(fish+n-cur+1<num) return;if(!hash[cur]&&sum+need[cur]<=m){for(i=1;i<=n;i++)thash[i]=hash[i];hash[cur]=2; //表示買了這條魚for(i=1;i<=n;i++){if(f[cur][i]&&!hash[i])hash[i]=1;}dfs(cur+1,sum+need[cur],fish+1);for(i=1;i<=n;i++)hash[i]=thash[i];hash[cur]=0;}dfs(cur+1,sum,fish);}int main(){int a,b,i,j;scanf("%d%d",&m,&n);l=0;ans=0,num=0;for(i=1;i<=n;i++){scanf("%d",&j);scanf("%d",&need[j]);} scanf("%d%d",&a,&b);while(a!=0||b!=0){f[a][b]=1; f[b][a]=1;scanf("%d%d",&a,&b);}//for(i=0;i<l;i++)//cout<<p[i]<<" "<<q[i]<<endl;//cout<<1<<endl;dfs(1,0,0);printf("%d %d",num,ans);//cout<<num<<" "<<ans<<endl;//for(i=1;i<=n;i++)//if(ansh[i]==2)//cout<<i<<endl;return 0;}