1244. Gentlemen
生活随笔
收集整理的這篇文章主要介紹了
1244. Gentlemen
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://acm.timus.ru/problem.aspx?space=1&num=1244
背包題? 理解并不難
主要在于如果答案有多個要輸出 -1
一個答案的話要輸出結果?? 否則輸出 0
用 sum [ n ] 表示到 n 有幾條路徑
狀態轉移方程為?
if(sum[j-a[i]])//a[i]表示第i個數據的大小
{
??????? sum[j]=max(sum[j]+1,sum[j-a[i]]);
}
代碼及其注釋:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm>#define LL long longusing namespace std;const int N=100003; int sum[N];//到 N 有幾條路徑 int f[N];// 記錄第一次到此用了那個數據 int a[103];// 數據大小 bool select[103];//是否用了 void Fselect(int x)//記錄用了哪幾個數據 {while(x){select[f[x]]=true;x=x-a[f[x]];} } int main() {//freopen("data.txt","r",stdin);int K,n;while(scanf("%d %d",&K,&n)!=EOF){memset(sum,0,sizeof(sum));sum[0]=1;memset(select,false,sizeof(select));int m=0;for(int i=1;i<=n;++i){scanf("%d",&a[i]);if(sum[K]>1)//如果答案有多個 則無需再找continue;m=min(m+a[i],K);//最大for(int j=m;j>=a[i];--j){if(sum[j]==0)//如果是求得第一條到此路徑 記錄用了哪一數據{f[j]=i;}if(sum[j-a[i]])//更新到此路徑數目{sum[j]=max(sum[j]+1,sum[j-a[i]]);}}if(sum[K]==1)Fselect(K);}if(sum[K]==0){printf("0\n");continue;}if(sum[K]>1){printf("-1\n");continue;}for(int i=1;i<=n;++i){if(!select[i])printf("%d ",i);}printf("\n");}return 0; }?
轉載于:https://www.cnblogs.com/liulangye/archive/2012/09/12/2682017.html
總結
以上是生活随笔為你收集整理的1244. Gentlemen的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从终端命令行运行 AppleScript
- 下一篇: 爱情,这种高级玩意儿--一个码农的自白