标签:
Description
Input
Output
Sample Input
12 9 4 5 2 8 5 100 120 5 21 32 110 54 3 0 0
Sample Output
3 1 2 4 Impossible to distribute
这题的做法就是对于M类型的巧克力做01背包,记录路径,
至于判断可行性可以背包后的容量来搞。简单题。
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<string> #include<iostream> #include<queue> #include<cmath> #include<map> #include<stack> #include<bitset> using namespace std; #define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i ) #define REP( i , n ) for ( int i = 0 ; i < n ; ++ i ) #define CLEAR( a , x ) memset ( a , x , sizeof a ) typedef long long LL; typedef pair<int,int>pil; const int INF = 0x3f3f3f3f; int M,L,n,cnt,w; int dp[1100]; int c[1100],pre[1100]; int ans[1100]; void dfs(int val) { if(val==0) return ; dfs(val-c[pre[val]]); ans[cnt++]=pre[val]; } int main() { while(~scanf("%d%d",&M,&L)&&(M+L)) { scanf("%d",&n); int sum=0; cnt=0; REPF(i,1,n) { scanf("%d",&c[i]); sum+=c[i]; } if(sum>M+L) { puts("Impossible to distribute"); continue; } CLEAR(pre,-1); CLEAR(dp,-1); dp[0]=0; for(int i=1;i<=n;i++) { for(int j=M;j>=c[i];j--) { if(dp[j-c[i]]!=-1&&dp[j-c[i]]+c[i]>dp[j]) { dp[j]=dp[j-c[i]]+c[i]; pre[j]=i; } } } for(int i=M;i>=0;i--) if(dp[i]!=-1) { w=i; break; } if(dp[w]+L<sum) { puts("Impossible to distribute"); continue; } dfs(w); printf("%d",cnt); REP(i,cnt) printf(" %d",ans[i]); puts(""); } return 0; } /* */
POJ 1293 Duty Free Shop(背包记录路径)
标签:
原文地址:http://blog.csdn.net/u013582254/article/details/46136337