【背包总结-输出所有方案】

来源:互联网 发布:mac上面怎么装office 编辑:程序博客网 时间:2024/05/22 06:43


#include <iostream>#include <cstring>#include <cmath>#include <queue>#include <stack>#include <list>#include <map>#include <set>#include <string>#include <cstdlib>#include <cstdio>#include <algorithm>using namespace std;int n,tot;const int N = 10;int dp[1010];int w[N],v[N];int p[1010][N];int output[N];void dfs(int idx,int s,int k){if(s <= 0){for(int i=k-1;i>=0;i--){cout << output[i] << " ";}cout << endl << endl;return;}if(p[s][idx] == 0){dfs(idx-1,s,k);}else if(p[s][idx] == 1){output[k] = idx;dfs(idx-1,s-w[idx],k+1);}else if(p[s][idx] == 2){output[k] = idx;dfs(idx-1,s-w[idx],k+1);dfs(idx-1,s,k);}}int main(){scanf("%d%d",&n,&tot);memset(dp,0,sizeof(dp));memset(p,-1,sizeof(p));for(int i=0;i<n;i++){scanf("%d%d",&w[i],&v[i]);}for(int i=0;i<n;i++){for(int j=tot;j>=w[i];j--){if(dp[j] > dp[j-w[i]]+v[i]){p[j][i] = 0;}else if(dp[j] < dp[j-w[i]] + v[i]){p[j][i] = 1;dp[j] = dp[j-w[i]] + v[i];}else{p[j][i] = 2;}}}cout << tot << endl;dfs(n-1,tot,0);//while(1);return 0;}


0 0
原创粉丝点击